替换文件中的字符串

2022-09-01 23:13:35

我正在寻找一种方法来替换文件中的字符串,而无需将整个文件读取到内存中。通常我会使用读取器和写入器,即如下所示:

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();
}

但是,我想就地进行替换,并且不认为我可以同时在同一文件上打开读取器和写入器。另外,我使用的是Java 1.4,所以无法访问NIO,Scanner等。

谢谢 唐


答案 1

对于文件,通常无法进行“就地”替换,除非替换的长度与原始文件的长度完全相同。否则,文件将需要增长,从而将所有后面的字节“向右”洗牌,或者缩小。执行此操作的常用方法是读取文件,将替换文件写入临时文件,然后用临时文件替换原始文件。

这还具有一个优点,即所讨论的文件始终处于原始状态或完全替换状态,永远不会介于两者之间。


答案 2

替换文件或流中的某些内容需要能够删除和插入任何位置的写入器或输出流。替换操作可以拆分为删除插入操作。

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

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


推荐