这是一个愚蠢的问题,但我无法弄明白。 我是否需要在使用资源的try中关闭作为参数传递的Object?
这是一个例子:
StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
...
}
我是否需要致电
sw.close();
尝试阻止之后?或者它是否自动关闭作为参数传递的所有Autocloseable对象?
答案 0 :(得分:3)
close
上PrintWriter
的隐式调用实际上也会关闭基础Writer
。
参见以下示例:
StringWriter sw = new StringWriter() {
@Override
public void close() throws IOException {
super.close();
System.out.println("closed");
}
};
try (PrintWriter pw = new PrintWriter(sw)) {};
<强>输出强>
closed
答案 1 :(得分:0)
添加一个finally块并关闭传递的对象。这是因为无论是否存在异常,都会始终执行block。
StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
...
}finally{
sw.close();
}
答案 2 :(得分:0)
您可以在try-with-resources初始化块中放置多个项目:
try (final StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
// ...
} catch (IOException e) {
// ...
}
它们都将自动关闭。
答案 3 :(得分:0)
PrintWriter
的{{1}}方法也会关闭close
(但是......是的,那里没有任何内容可以关闭)。这不是其他包装纸的常见情况。
您可以在StringWriter
块中传递两个对象,以确保它们将被关闭:
try
答案 4 :(得分:0)
由于这两个类都实现了AutoClosable接口,您可以尝试类似下面的内容。它会自动关闭这两个对象。
try(
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw)
) { ... }