在 Java 中使用 PrintWriter 需要关闭什么
What do I need to close when using PrintWriter in Java
像这样使用 PrintWriter
时 :
PrintWriter fileOut = new PrintWriter(new BufferedWriter(new FileWriter(csvFileIn)));
我需要在 finally 块中关闭什么? PrintWriter、BufferedWriter 和 FileWriter ?
我需要尝试捕获 finally 块中的关闭语句吗?
[编辑]
我需要用到java6,所以不能用try-with-resources语句
你应该使用-
fileOut.close();
因为您没有为 BufferedWriter
或 FileWriter
分配任何变量名称,所以当您关闭 fileOut
时,fileOut
也是由它们组成的,它将依次关闭两个流。
您可以使用 try-with-resources 块
try (PrintWriter fileOut = new PrintWriter(new BufferedWriter(new FileWriter(csvFileIn)))) {
//WHATEVER you need to do
}
由于 PrintWriter
实现了 AutoCloseable
一旦 try 块完成它就会自行关闭(即使引发异常)
查看有关此内容的更多信息here
严格来说,您应该关闭所有三个流。我什至会添加第四层,因为您可能不想使用 默认系统编码 写出 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
阻止的可能性很小。然后,它看起来像这样:
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");
}
像这样使用 PrintWriter
时 :
PrintWriter fileOut = new PrintWriter(new BufferedWriter(new FileWriter(csvFileIn)));
我需要在 finally 块中关闭什么? PrintWriter、BufferedWriter 和 FileWriter ?
我需要尝试捕获 finally 块中的关闭语句吗?
[编辑] 我需要用到java6,所以不能用try-with-resources语句
你应该使用-
fileOut.close();
因为您没有为 BufferedWriter
或 FileWriter
分配任何变量名称,所以当您关闭 fileOut
时,fileOut
也是由它们组成的,它将依次关闭两个流。
您可以使用 try-with-resources 块
try (PrintWriter fileOut = new PrintWriter(new BufferedWriter(new FileWriter(csvFileIn)))) {
//WHATEVER you need to do
}
由于 PrintWriter
实现了 AutoCloseable
一旦 try 块完成它就会自行关闭(即使引发异常)
查看有关此内容的更多信息here
严格来说,您应该关闭所有三个流。我什至会添加第四层,因为您可能不想使用 默认系统编码 写出 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
阻止的可能性很小。然后,它看起来像这样:
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");
}