我正在寻找一种方法来替换文件中的字符串,而无需将整个文件读入内存。通常我会使用Reader and Writer,例如以下内容:
public static void replace(String oldstring, String newstring, File in, File out)
throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(in));
PrintWriter writer = new PrintWriter(new FileWriter(out));
String line = null;
while ((line = reader.readLine()) != null)
writer.println(line.replaceAll(oldstring,newstring));
// I'm aware of the potential for resource leaks here. Proper resource
// handling has been omitted in the interest of brevity
reader.close();
writer.close();
}
但是,我想在原地进行替换,并且我认为我不能同时在同一个文件上打开Reader和Writer。另外,我使用的是Java 1.4,因此无法访问NIO,Scanner等。
谢谢, 唐
答案 0 :(得分:31)
“就地”通常不能替换文件,除非替换的长度与原始文件的长度完全相同。否则,文件需要增长,从而将所有后面的字节“向右”混乱,或缩小。执行此操作的常用方法是读取文件,将替换文件写入临时文件,然后用临时文件替换原始文件。
这也有一个优点,即所讨论的文件始终处于原始状态或完全替换状态,从不介于两者之间。
答案 1 :(得分:2)
替换文件或流中的内容需要Writer或OutputStream,它能够在任何位置删除和插入字节。替换操作可以拆分为 delete 和 insert 操作。
查看OutputStream和Writer的API我找不到合适的方法。可以使用OutputStream来写入带有偏移量的字节,但这只会覆盖现有的上下文。所以它适用于特殊情况,原始和替换具有相同的长度。
所以我现在认为,将编辑过的行写入临时文件并在之后用临时文件替换orignal文件仍然是最佳解决方案。