gpt4 book ai didi

java - 如何在java中替换大文件末尾的字符串?

转载 作者:行者123 更新时间:2023-12-04 17:16:07 32 4
gpt4 key购买 nike

我的文件很大,所以我不想读取和搜索整个文件。 java中有没有一种方法可以从文件的末尾逐行搜索,然后替换其中的某个部分?

我的文件看起来像这样:

Line 1
Line 2
Line 3
......
Line 99995
Line 99996
abc_
Line 99998
Line 99999

我想将 abc_ 替换为 def_

最佳答案

您可以使用 FileChannelReversedLinesFileReader 执行此操作。要使用阅读器,您需要添加 Appache-Commons IO 依赖项:

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>

首先你需要找到你的行 abc_ 的位置。之后,您可以使用 FileChanneldef_ 行写入您的文件并找到 position

代码为:

import org.apache.commons.io.input.ReversedLinesFileReader;

import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.util.Collection;

import static java.nio.file.StandardOpenOption.READ;
import static java.nio.file.StandardOpenOption.WRITE;

String path = "path/to/your/file";
String seekingLine = "abc_";
// be careful, if replacing line is bigger
// than seekingLine it will replace symbols after seekingLine
String replacingLine = "def_";
// finding position to replace
int seekingLinePosition = 0;
File file = new File(path);
try (ReversedLinesFileReader reader = new ReversedLinesFileReader(file)) {
String line;
while ((line = reader.readLine()) != null && !line.equals(seekingLine)) {
// + 1 because of line doesn't content line ending character
seekingLinePosition = seekingLinePosition + line.getBytes().length + 1;
}
}
// count seekingLine bytes for shifting
seekingLinePosition = seekingLinePosition + seekingLine.getBytes().length + 1;
// replace bytes by position
try (FileChannel fc = FileChannel.open(Paths.get(path), WRITE, READ)) {
// shift to the start of seekingLine and write replacingLine bytes
// +1 is because of uncounted seekingLine line ending char
ByteBuffer replacingBytes = ByteBuffer.wrap(replacingLine.getBytes());
fc.write(replacingBytes, fc.size() - seekingLinePosition + 1);
}

注意:

FileChannel.write 将重写自 position 以来的字节,这意味着您只能用相同长度的行替换 abc_ (def_ 具有相同的长度)。

关于java - 如何在java中替换大文件末尾的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68684607/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com