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

Java 使用try with resources读取和写入同一文件,java,file-io,variadic-functions,try-with-resources,Java,File Io,Variadic Functions,Try With Resources,我正在尝试制作一个程序,该程序接收指定的字符串,并删除文本文档中出现的每个字符串。用于读/写的文本文件是相同的。使用的参数从cmd接收,顺序如下: inputString filename 程序编译得很好,但运行后会将原始文本文件留空。如果我为输入处理创建一个try-catch块,为输出处理创建一个try-catch块,那么我就能够读写同一个文件。如果使用try with resources块,我可以读取一个文件,并将输出保存到与原始文件不同的文件中,同时删除cmd中出现的所有inputStr

我正在尝试制作一个程序,该程序接收指定的
字符串
,并删除文本文档中出现的每个
字符串
。用于读/写的文本文件是相同的。使用的参数从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循环之前,原始文件会被一个空白文件覆盖。我就在这里吗?是否可以使用try with resources读取和写入同一文件?

来自PrintWriter:

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

因此,您是正确的,在初始化
PrintWriter
时,您的
Scanner
没有要扫描的内容

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


也就是说,如果文件有一个合理的内存大小来处理替换

以副本形式关闭,但副本错误。重新打开。谢谢你的回答,我可能应该一个人解决这个问题;)@不客气。事实上,你已经有点明白了:)