2010-06-30 156 views
23

我正在寻找一种方法来替换文件中的字符串,而无需将整个文件读入内存。通常我会用一个读者与作者,也就是类似如下:替换文件中的字符串

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,所以dont't访问NIO,扫描仪等

谢谢, 唐

+1

只是FYI,你知道'replaceAll'是基于正则表达式的,对吧?如果你只是想直接进行字符串替换(如你的形式参数名称所示),你可以使用replace(CharSequence,CharSequence)方法。 – polygenelubricants 2010-06-30 08:40:26

+0

如何写入临时文件然后替换原文件? – InsertNickHere 2010-06-30 08:40:45

回答

31

“到位”代替通常是不可能的文件,除非更换与原始长度完全相同。否则,该文件将需要增长,从而将后面的所有字节“向右”移动或缩小。这样做的常见方法是读取文件,将替换文件写入临时文件,然后用临时文件替换原始文件。

这也有一个好处,即所涉及的文件始终处于原始状态或处于完全替换状态,从不处于中间状态。

+3

+1对于一个很好解释的答案 – naikus 2010-06-30 10:24:49

2

替换文件或流中的内容需要一个Writer或OutputStream,它能够在任何位置删除和插入字节。替换操作可拆分为删除插入操作。

查看OutputStream和Writer的API我无法找到合适的方法。可以使用OutputStream来写入偏移量的字节,但这会简单地覆盖现有的上下文。所以它可以适用于特殊情况,原始文件和替换文件具有相同的长度。

所以现在我认为,将编辑过的行写入临时文件,然后用临时文件替换原始文件仍然是最佳解决方案。