【问题标题】:What do I need to close when using PrintWriter in Java [duplicate]在Java中使用PrintWriter时我需要关闭什么[重复]
【发布时间】:2016-11-10 20:24:01
【问题描述】:

当像这样使用PrintWriter 时:

PrintWriter fileOut = new PrintWriter(new BufferedWriter(new FileWriter(csvFileIn)));

我需要在 finally 块中关闭什么? PrintWriter、BufferedWriter 和 FileWriter ?

我是否需要尝试在 finally 块中捕获 close 语句?

[编辑] 我需要使用java 6,所以不能使用try-with-resources语句。

【问题讨论】:

    标签: java try-catch filewriter printwriter bufferedwriter


    【解决方案1】:

    你应该使用 -

    fileOut.close();
    

    由于您没有为BufferedWriterFileWriter 分配任何变量名称,所以当您关闭fileOut 时,fileOut 也是由它们生成的,它将依次关闭两个流。

    【讨论】:

    • 我需要在这么近的地方尝试一下吗?
    【解决方案2】:

    您可以使用 try-with-resources

    try (PrintWriter fileOut = new PrintWriter(new BufferedWriter(new     FileWriter(csvFileIn)))) {
        //WHATEVER you need to do
    }
    

    由于PrintWriter 实现了AutoCloseable,它会在try 块完成后自行关闭(即使引发异常)

    查看有关此here的更多信息

    【讨论】:

      【解决方案3】:

      严格来说,您应该关闭所有三个流。我什至会添加第四层,因为您可能不想使用 默认系统编码 写出 CSV 文件,而是使用客户指定的编码。就是这样:

      try (FileOutputStream fos = new FileOutputStream(csvFileIn);
           FileWriter fwr = new FileWriter(fos, StandardEncodings.UTF_8);
           BufferedWriter bwr = new BufferedWriter(fwr);
           PrintWriter pwr = new PrintWriter(bwr)) {
        pwr.println("Field1;Field2;Field3");
        pwr.println("Data1;Data2;Data3");
      }
      

      实际上,通常只关闭最外层的流,因为它(通常)将close() 调用转发到其包装的流,并且在打开文件和到达try 块之间获得OutOfMemoryError 的可能性很小.然后,它看起来像这样:

      try (PrintWriter pwr = new PrintWriter(new BufferedWriter(new FileWriter(new FileOutputStream(csvFileIn), StandardEncodings.UTF_8)))) {
        pwr.println("Field1;Field2;Field3");
        pwr.println("Data1;Data2;Data3");
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-11
        • 2014-02-18
        • 2020-08-28
        • 2011-05-28
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        相关资源
        最近更新 更多