使用 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)