OutputStream fos;
OutputStream bos;
OutputStream zos;
try {
fos = new FileOutputStream(anyFile);
bos = new BufferedOutputStream(fos);
zos = new ZipOutputStream(bos);
} finally {
if (zos != null) {
zos.close(); // + exception handling
}
}
关闭zos
是否会自动关闭bos
和fos
,还是需要手动关闭它们?
答案 0 :(得分:8)
是的,确实如此。其Javadoc说:
关闭ZIP输出流以及正在过滤的流。
此外,Javadoc for BufferedOutputStream
说:
关闭此输出流并释放与该流关联的所有系统资源。
close
FilterOutputStream
方法调用其flush
方法,然后调用其基础输出流的close
方法。
因此,当您关闭ZipOutputStream
时,它会关闭BufferedOutputStream
,然后关闭FileOutputStream
。
答案 1 :(得分:4)
是
ZipOutputStream.close()
方法由Closeable.close()
指定,其中:
关闭此流并释放与之关联的所有系统资源 它
同样适用于BufferedOutputStream.close()
,这是一种继承自FilterOutputStream
的方法。
答案 2 :(得分:2)
关闭包装器流会自动关闭内部流。
因此,在您的情况下,您只需要关闭ZipOutputStream
。关闭流两次不会引发异常,因此再次关闭内部流(尽管不必要)也可以。
以下是实例化ZipOutputStream
public ZipOutputStream(OutputStream out) {
this.out = out; // BufferedOutputStream reference saved
}
以下是ZipOutputStream.close()
public void close() throws IOException {
try {
flush();
} catch (IOException ignored) {
}
out.close(); // BufferedOutputStream being closed
}
同样,BufferedOutputStream
会通过其继承的FileOutputStream
自动关闭FilterOutputStream#close()
,其实现方式为:
public void close() throws IOException {
try {
flush();
} catch (IOException ignored) {
}
out.close(); // FileOutputStream being closed
}
答案 3 :(得分:0)
是的。但奇怪的是,当我运行强化扫描并启用了查找错误时,它会捕获所有这些包裹和未关闭的流作为要修复的高优先级项目。不知道为什么他们这样做