假设我有一个文本文件:
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命令!