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



假设我有一个文本文件:

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

我所要做的就是打开上述文件并将年龄更改为24或25。有没有办法做到这一点,在Java没有读取写入整个文件?我知道它可能与缓冲的阅读器和写入器,但我正在寻找一个更少的内存密集的方式,当文件变得巨大

简短的回答:no.

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

然而,还有其他困难:

你可能有可变长度的行,所以你不知道去哪里找。您仍然必须读取文件,直到您进行替换的地方,即使您一次执行一个块并丢弃不需要的块。

使用像UTF-8这样的多字节字符集会更加复杂。输入的文本可能显示为与输出文本相同的长度,但根据替换可能更短或更长。

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

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

我发现Hobo是正确的,你可以用"99"代替"23",但不能用" 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.

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

相关内容

  • 没有找到相关文章

最新更新