说我有一个文本文件:
I love bananas.
<age> 23 </age> years old.
I like beaches.
我想要做的就是打开所说的文件并将年龄改为24或25.任何方式在Java中都可以这样做而不读写整个文件?我知道它可以使用缓冲的读写器,但是当文件变得庞大时,我正在寻找一种内存不太密集的方式。
答案 0 :(得分:7)
简答:不。
答案很长: 并不是的。如果你知道你正在插入的文本直接替换你要删除的文本,你可以通过寻找文件的一部分,读取一个小块,替换新文本并替换该块来执行替换。这适用于你的年龄替换示例,但是如果你用9替换9或者用100替换99则不行。
然而,还有其他困难:
您可能有可变长度的行,因此您不知道在哪里寻找。您仍然必须将文件读取到您进行替换的位置,即使您一次只执行一次阻止并丢弃不需要的文件。
UTF-8等多字节字符集更加复杂。您的进入文本可能会显示与传出文本相同的长度,但可能会更短或更长,具体取决于替换。
JavaDSL
(U + 0065)代码为一个字节,但e
(U + 00E9)代码为两个。
但是,如果您只是寻找内存较少的方法,则可以一次读取一行文件,并在处理时将每行写入新文件。完成后,删除旧文件并重命名新文件。这可能很慢,所以缓冲读写,例如,20行(或100或1000,或任何你选择的......)将提高性能。
答案 1 :(得分:0)
我发现Hobo是正确的,你可以替换&#34; 23&#34;用&#34; 99&#34;但不是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命令!