【问题标题】:Why can't I write FileWriter outside of Try with resources?为什么我不能用资源在 Try 之外编写 FileWriter?
【发布时间】:2021-07-29 21:43:40
【问题描述】:

所以,我只是想创建一个程序来将内容从一个文件(source1)复制到另一个文件(source2)并将其转换为小写......同时这样做我想出了以下代码:

        try(FileWriter fr=new FileWriter("Source1.txt")){
            String str="UPPER CASE";
            fr.write(str);
        }


        File file=new File("Source1.txt");
        //FileReader fr=new FileReader("Source1.txt"); // (1)
        //FileWriter f2=new FileWriter("Source2.txt"); // (2)

        try(FileReader fr=new FileReader("Source1.txt");FileWriter f2=new FileWriter("Source2.txt")){ //If i remove 
//file Reader from here and uncomment (1) the code works fine but if i do so with FileWriter (Remove
//fileWriter from here and uncomment (2)) I can't copy the contents of the file (No error is shown... the code executes but Source2.txt just comes out as blank file.


            char x[]=new char[(int)file.length()];
            fr.read(x);
            String str=new String(x);
            System.out.println(str);
            String st=str.toLowerCase();
            f2.write(st);


        }

代码没有问题,但我只是想知道它为什么会这样工作(请阅读代码中的注释)?

【问题讨论】:

  • 您的评论说“我无法复制文件的内容”。为什么不?你得到一个编译器错误吗?运行时异常?请发布详细信息(包括任何适用的错误消息或堆栈跟踪)。
  • 如果您不使用 try-with-resources,您需要自己在文件处理程序上调用 close()。 Try-with-resources 更好:坚持下去。
  • @TedHopp 没有显示错误... source2.txt 将只是空白...我认为放置空白输出没有意义。
  • @khelwood 我只是想知道 fileReader 在 try 块之外但不是 fileWriter 有什么作用
  • @SomethingNice 大概是因为您没有关闭文件写入器,并且您尝试写入的一些内容仍然被缓存。

标签: java file filereader file-handling filewriter


【解决方案1】:

如果你不使用try-with-resource,你必须自己关闭资源。
这对于将任何缓存数据写入流(刷新)是必要的,例如写入文件;也有利于释放系统资源。


try (var resource = new Resource()) {
    // statements
}

基本上(忽略错误处理/异常)与:

var resource = new Resource();
// statements
resource.close();

或者(更好一点)

var resource = new Resource();
try {
    // statements
} finally {
    resource.close();
}

如果添加错误处理,这可能会变得有些复杂 - 所以最好使用try-with-resource(至少它使代码更容易阅读/理解/维护)。

【讨论】:

  • 这是正确的。但这会给他指明错误的方向。所以我不支持这个。
  • f2.flush() 也可以。因此,写入的内容将保留在 Buffer 中,并且在调用 f2.close() 之前不会被刷新。如果我想绕过这个,那么我可以使用 f2.flush() 而不关闭(不推荐)。
【解决方案2】:

如果编写器的 try-with-resources 用完了,您需要注意使用刷新和关闭编写器

f2.flush()
f2.close()

flush() 刷新流。如果流已将来自各种 write() 方法的任何字符保存在缓冲区中,它会立即将它们写入其预期目的地。

Try-with-resources 隐含地做同样的事情。

【讨论】:

  • 通常不需要调用flush()。对close() 的调用将确保在底层输出流关闭之前刷新输出。在调用close() 之前调用flush() 的唯一原因是单独处理刷新流时可能出现的任何异常。当调用close() 时,此类异常会被吞没。
猜你喜欢
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 2014-02-21
  • 2020-02-08
  • 1970-01-01
相关资源
最近更新 更多