10
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自动关闭bosfos还是我需要手动关闭它们?

4

4 回答 4

8

是的,它确实。它的Javadoc说:

关闭 ZIP 输出流以及被过滤的流。

此外,JavadocBufferedOutputStream说:

关闭此输出流并释放与该流关联的所有系统资源。

close方法FilterOutputStream调用其flush方法,然后调用close其底层输出流的方法。

所以当你关闭你的ZipOutputStream,它会关闭你的BufferedOutputStream,这又会关闭你的FileOutputStream

于 2013-08-05T09:01:48.660 回答
3

是的。

ZipOutputStream.close()方法由以下指定Closeable.close()

关闭此流并释放与其关联的任何系统资源。

这同样适用于BufferedOutputStream.close()从 继承的方法FilterOutputStream

于 2013-08-05T09:05:01.560 回答
2

关闭包装流会自动关闭内部流。

所以,在你的情况下,你只需要 close ZipOutputStream。两次关闭流不会引发异常,因此再次关闭内部流(尽管不必要)也可以。

以下是实例化 a 时发生的情况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的自动关闭已实现为:FileOutputStreamFilterOutputStream#close()

public void close() throws IOException {
    try {
      flush();
    } catch (IOException ignored) {
    }
    out.close(); // FileOutputStream being closed
}
于 2013-08-05T09:06:53.717 回答
0

是的,它确实。但奇怪的是,当我在启用查找错误的情况下运行强化扫描时,它会将所有这些包装和未封闭的流作为要修复的高优先级项目捕获。不知道他们为什么这样做

于 2015-12-16T04:10:30.930 回答