在Java中使用PrintWriter时需要关闭什么

时间:2016-07-08 09:54:18

标签: java try-catch filewriter printwriter bufferedwriter

使用if ARGV.include? '--provision-with' config.vm.provision 'db-reset', type: 'shell', inline: 'mysql ...' end 时这样:

PrintWriter

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

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

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

3 个答案:

答案 0 :(得分:3)

你应该使用 -

fileOut.close();

由于您没有为BufferedWriterFileWriter分配任何变量名称,因此当您关闭fileOut时,fileOut也会由{{1}}生成{{1}}流。

答案 1 :(得分:3)

您可以使用 try-with-resources

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

由于PrintWriter实现AutoCloseable,一旦尝试块完成,它就会自动关闭(即使引发了异常)

查看有关此here

的更多信息

答案 2 :(得分:0)

严格来说,你应该关闭所有三个流。我甚至会添加第四层,因为您可能不想使用默认系统编码写出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()调用转发到其包装的流,并在打开文件到达{{1}之间获得OutOfMemoryError阻止是不太可能的。然后,它看起来像这样:

try