Java 替换文件中的字符串

Java 替换文件中的字符串,java,io,Java,Io,我正在寻找一种方法,在不将整个文件读入内存的情况下替换文件中的字符串。通常情况下,我会使用读写器,如以下内容: public static void replace(String oldstring, String newstring, File in, File out) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(in)); PrintWriter wr

我正在寻找一种方法,在不将整个文件读入内存的情况下替换文件中的字符串。通常情况下,我会使用读写器,如以下内容:

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();
}
但是,我想在适当的位置进行替换,并且我不认为可以在同一个文件上同时打开读写器。另外,我使用的是Java1.4,因此无法访问NIO、Scanner等

谢谢, Don

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


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

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

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


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

仅供参考,您知道
replaceAll
是基于正则表达式的,对吗?如果您只想进行直接字符串文字替换(正如您的正式参数名称所建议的那样),您可以使用
replace(CharSequence,CharSequence)
方法来代替。将其写入临时文件,然后替换原始文件怎么样?