关闭嵌套流也会关闭其父流吗?

时间:2013-08-05 08:59:41

标签: java stream nested

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 个答案:

答案 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)

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