【问题标题】:Closing a nested stream closes its parent streams too?关闭嵌套流也会关闭其父流?
【发布时间】:2013-08-05 08:59:41
【问题描述】:
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,还是我需要手动关闭它们?

【问题讨论】:

  • 你还应该小心总是关闭最外层的流;否则您可能会因为包装流中的未刷新缓冲区而导致数据丢失,这些缓冲区使它们的包装流在他们的鼻子下关闭。

标签: java stream nested


【解决方案1】:

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

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

另外,Javadoc for BufferedOutputStream 说:

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

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

因此,当您关闭 ZipOutputStream 时,它会关闭您的 BufferedOutputStream,而这又会关闭您的 FileOutputStream

【讨论】:

    【解决方案2】:

    是的。

    ZipOutputStream.close() 方法由 Closeable.close() 指定,其中:

    关闭此流并释放与 它。

    这同样适用于BufferedOutputStream.close(),这是一个继承自FilterOutputStream 的方法。

    【讨论】:

      【解决方案3】:

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

      因此,在您的情况下,您只需要关闭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 通过其继承的FilterOutputStream#close() 自动关闭FileOutputStream,实现如下:

      public void close() throws IOException {
          try {
            flush();
          } catch (IOException ignored) {
          }
          out.close(); // FileOutputStream being closed
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-07-17
          • 2011-09-29
          • 1970-01-01
          • 1970-01-01
          • 2011-04-26
          • 2012-04-05
          • 1970-01-01
          • 2015-11-03
          • 1970-01-01
          相关资源
          最近更新 更多