【问题标题】:Way to close specific output streams关闭特定输出流的方法
【发布时间】:2011-11-30 12:37:11
【问题描述】:

您认为这段代码是否正确关闭了输出流条目?知道这不是同一类型的输出流。

OutputStream out = new JarOutputStream(new FileInputstrem(fileName));
                       ...
((ZipOutputStream)out).closeEntry();

但考虑到两者都是输出流,我认为它们以相同的方式关闭。因此在我的情况下,((ZipOutputStream)out).closeEntry();((JarOutputStream)out).closeEntry(); 相同

你能确认如果你认为是真的,或者如果错了就纠正我吗? 谢谢。

【问题讨论】:

    标签: java stream outputstream zipoutputstream


    【解决方案1】:

    由于JarOutputStream 扩展了ZipOutputStream,并且由于Java 中的所有方法都是虚拟的,因此

    ((ZipOutputStream) out).closeEntry();
    

    调用完全相同的方法 ass

    ((JarOutputStream) out).closeEntry();
    

    但是,我建议您将静态类型更精确一点:

    ZipOutputStream out = new JarOutputStream(new FileInputstrem(fileName));
                       ...
    out.closeEntry();
    

    【讨论】:

      【解决方案2】:

      如果您需要在out 变量上调用特定于ZipOutputStream 的方法,则其类型不应为OutputStream,而是ZipOutputStream

      ZipOutputStream out = new JarOutputStream(new FileInputstrem(fileName));
                         ...
      out.closeEntry();
      

      这不会导致任何问题,因为因为JarOutputStream 扩展了ZipOutputStream,所以JarOutputStream 也是ZipOutputStream(也是OutputStream,也是Object)。

      【讨论】:

      • 谢谢我不知道 JarOutputStream 是扩展 ZipOutputStream 并且它不是特定于 ZipOutputStream 的调用方法,而是创建通用方法来创建 Zip 和 Jar 存档并使用通用方法来关闭它们的输出流条目这种方法。但是现在我知道 JarOutputStream 继承了 ZipOutputStream,这是最容易实现的。谢谢。
      • 如果JarOutputStream 没有扩展ZipOutputStream,那么执行(ZipOutputStream) out 将导致ClassCastException
      • 不一定,因为关闭条目对所有输出流条目执行相同的工作。这就是我问这个问题的原因。我不确定。
      【解决方案3】:
      ZipOutputStream.closeEntry();
      

      JarOutputStream.closeEntry();
      

      两者都关闭 ZIP 条目,因此您可以将另一个条目写入存档文件(如果您想将多个文件存储到一个 ZIP/JAR 中)。它们不会关闭输出流本身。如果要关闭 JarOutputStream 和底层 FileOutputStream,请使用 out.close();

      参见: http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/ZipOutputStream.html#close() http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/ZipOutputStream.html#closeEntry()

      【讨论】:

        【解决方案4】:

        因此在我的情况下 ((ZipOutputStream)out).closeEntry();是 等同于 ((JarOutputStream)out).closeEntry();

        没错。没有理由写前者。

        【讨论】:

          猜你喜欢
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 2015-06-18
          • 2012-02-07
          • 1970-01-01
          • 1970-01-01
          • 2011-09-04
          • 1970-01-01
          相关资源
          最近更新 更多