java - 替换文件中的字符串

标签 java io

我正在寻找一种方法来替换文件中的字符串,而无需将整个文件读入内存。通常我会使用 Reader 和 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 等。

谢谢, 唐

最佳答案

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

这还有一个优点,即相关文件始终处于原始状态或完全替换状态,而不会介于两者之间。

关于java - 替换文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3147615/

相关文章:

Java 日期格式 : How to deal with "st", "nd", "rd", "th"?

linux - fio benchmark 延迟说明

java - 从特定单词后开始读取文件

java - 是否有与 Twitter 的 Ostrich 库等效的 Java?

java - 在Java中获取最大值sql

c++ - 如何在 Windows 上将 BYTE 数组映射为 FILE *

c - 字符串数组的文件输出

Java Filenotfound 异常被抛出

java - 在 Java 中实现具有两种不同返回类型的访问者模式

java - 多线程环境中的基准测试