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

Posted

技术标签:

【中文标题】使用 try-with-resources 读取和写入同一个文件【英文标题】:Reading and writing to the same file using try-with-resources 【发布时间】:2016-05-27 11:04:31 【问题描述】:

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

inputString filename

程序编译正常,但运行后将原始文本文件留空。如果我为输入处理创建一个 try-catch 块,为输出处理创建一个 try-catch 块,我就可以读取和写入同一个文件。如果我使用 try-with-resources 块,我可以读取一个文件,并将输出保存到与原始文件不同的文件中,并删除所有出现在 cmd 中的 inputString。但似乎我无法,而且当我尝试这样做时,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 执行之前,原始文件被一个空白文件覆盖。我在这里吗?是否可以?

【问题讨论】:

因重复错误而关闭。重新打开。 【参考方案1】:

来自 PrintWriter docs:

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

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

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

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

【讨论】:

感谢您的回答,我可能应该独自解决这个问题;) @Esben86 不客气。你真的确实想出来了:)

以上是关于使用 try-with-resources 读取和写入同一个文件的主要内容,如果未能解决你的问题,请参考以下文章

基础笔记10(IO 1.7try-with-resource)

使用try-with-resources围绕扫描仪

Java try-with-resources 卡住了

java7 try-with-resources 很香

在 JDK 9 中更简洁使用 try-with-resources 语句

如何在 Java 中对接口对象使用 try-with-resources 语句