是否可以在不读取和写入整个文件的情况下更改 txt 文件中的一行 (Java)?

Is it possible to change ONE line in a txt file WITHOUT reading and writing the whole file (Java)?

假设我有一个文本文件:

I love bananas.
<age> 23 </age> years old.
I like beaches.

我只想打开所述文件并将年龄更改为 24 或 25。有什么方法可以在 Java 中做到这一点而无需读取和写入整个文件?我知道使用缓冲 reader 和编写器是可能的,但是当文件变得很大时,我正在寻找一种内存密集度较低的方法。

简答:没有。

长答案: 并不真地。如果您知道您插入的文本直接替换了您要删除的文本,您可以通过查找文件部分、读取一个小块、替换新文本并替换该块来执行替换。这适用于您的 年龄替换示例,但如果您将 9 替换为 10,或将 99 替换为 100,则无效。

但是,还有其他困难:

您可能有可变长度的行,因此您不知道要查找到哪里。您仍然需要阅读文件直到您进行替换的地方,即使您一次一个块地执行并丢弃不需要的内容。

使用 UTF-8 等多字节字符集会更加复杂。您的传入文本可能显示为与传出文本相同的长度,但可能会更短或更长,具体取决于替换内容。

e(U+0065)编码为一个字节,但é(U+00E9)编码为两个。

但是,如果您只是在寻找一种内存密集度较低的方法,您可以一次读取一个文件一行,然后在处理它时将每一行写入一个新文件。完成后,删除旧文件并重命名新文件。这可能会很慢,因此缓冲读取和写入,例如 20 行(或 100 行,或 1000 行,或您选择的任何内容......)将提高性能。

我发现 Hobo 是正确的,您可以将“23”替换为“99”而不是 100。我能够使用这个:

Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(file_paths), charset);
content = content.replaceAll(OldNumber,Integer.toString(NewNumber)); 
Files.write(file_paths, content.getBytes(charset)); // Writes it back to the file.

此外还有另外两种方法:Apache 中的Filename.utils随机文件访问 方法。要找到您要替换的内容,请使用 .replace 命令!