使用try with resources读取和写入同一文件



我正在尝试制作一个程序,该程序接收指定的String,并删除文本文档中出现的每个String。用于读/写的文本文件是相同的。使用的参数是从cmd接收的,顺序如下:

inputString filename

该程序编译良好,但运行后会将原始文本文件留空。如果我制作了一个用于输入处理的try-catch块和一个用于输出处理的try/catch块,我就可以读写同一个文件。如果我使用try with resources块,我可以读取一个文件,并将输出保存到与原始文件不同的文件中,同时删除cmd中所有inputString的出现。但是,我似乎无法使用try-with-resources读取和写入同一个文件,而且当我尝试使用这种方式时,input.hasNext()语句也会返回false。

下面的代码示例:

package ch12;
import java.io.*;
import java.util.*;
public class Chapter_12_E11_RemoveText {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.out.println("Usage java ch12.Chapter_12_E11_RemoveText inputString filename");
System.exit(1);
}
File filename = new File(args[1]);
if (!filename.exists()) {
System.out.println("Target file " + args[1] + " does not exist");
System.exit(2);
}
try (
Scanner input = new Scanner(filename);
PrintWriter output = new PrintWriter(filename); 
) {
System.out.println("hasNext() is " + input.hasNext());
System.out.println("hasNextLine() is " + input.hasNextLine());
while (input.hasNext()) {
String s1 = input.nextLine();
System.out.println("String fetched from input.nextLine() " + s1);
System.out.println("Attemping to replace all words equal to " + args[0] + " with """);
String s2 = s1.replaceAll(args[0], "");
output.println(s2);
}
}
}
}  

我怀疑,当我用参数filename创建一个新的PrintWriter对象时,在while-loop执行之前,原始文件会被一个空白文件覆盖。我就在这里吗?是否可以使用try-and-resources读取和写入同一个文件?

来自PrintWriter文档:

如果文件存在,则它将被截断为零大小;否则,将创建一个新文件。

所以您是正确的,当您初始化PrintWriter时,您的Scanner没有什么可扫描的。

我会从资源初始化块中删除PrintWriter初始化,在内存中构建文件表示,然后在另一个块中替换文件内容(或嵌套它)。

也就是说,如果文件的大小适合您的内存来处理替换。

最新更新