【问题标题】:When to use deflate() of deflateroutputstream?何时使用 deflate() 的 deflateroutputstream?
【发布时间】:2020-12-23 14:16:01
【问题描述】:

我正在尝试学习如何在寒假期间使用 DeflaterOutputStream 来消磨时间。我很困惑,因为当我查看文档https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html 时,它说deflate() 用于将压缩数据写入OutputStream,而write() 用于将数据写入DeflaterOutputStream(压缩OutputStream)进行压缩。

但是,我在互联网上查看示例代码,但根本没有使用 deflate()。到目前为止我看到的所有代码都只是 write() 到 DeflaterOutputStream 而没有调用 deflate()https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

我注意到代码在 DeflaterOutputStream 中放置了一个 FileOutputStream,但它是如何交互的?数据写入DeflaterOutputStream时是否自动调用deflate()将压缩数据发送到FileOutputStream?

【问题讨论】:

    标签: java outputstream


    【解决方案1】:

    它是protected:它适用于任何对该流的子类化,并且您没有对其进行子类化,所以就您而言,它是一个实现细节,您不能将其包含在您的推理中,这并不意味着供你调用。

    当然,除非您将其子类化。

    你能做到的——它是一种用于在其上构建基于 LZ 的压缩流的工具包。这就是 GZipOutputStream 和 ZipOutputStream 都对其进行扩展的原因:它们是不同的容器,或多或少使用相同的压缩技术。他们确实调用了deflate。除非您正在开发自己的基于 LZ 的压缩系统或为现有的、非 zip、非 gz、非 deflater 的压缩格式实现阅读器,否则这不适合您。

    这些类型的输出流被称为“过滤器流”:它们本身并不代表任何资源,它们环绕一个资源。它们可以环绕任何OutputStream(或任何InputStream,可以说这个概念适用于“双方”),并修改传输中的字节。

    var out = new DeflaterOutputStream(whatever) 创建一个新的 deflater 流,它将压缩您发送给它的任何数据(通过out.write(stuff)),然后它会依次获取压缩数据并将其发送到任何地方。它的作用是:

    1. 占用字节(根据out.write),缓冲完成工作所需的数量:
    2. ...压缩此数据。
    3. 然后通过调用其write 方法将压缩数据发送到封装的输出流(在本例中为whatever),处理压缩数据。

    基本用法是:

    1. 创建一个资源,例如 Files.newOutputStreamsomeSocket.getOutputStreamhttpServletResponse.getOutputStream()System.out 或任何其他产生流的东西 - 这是一个抽象概念,原因是:让事情变得灵活。
    2. 将该资源包装到DeflaterOutputStream
    3. 将所有数据写入 deflater 输出流。忘掉原来的吧 - 你制作它是为了将它传递给 DeflaterOutputStream,这就是你与底层流的交互结束的地方。
    4. 关闭 deflaterstream(最终也会关闭底层流)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2014-12-08
      相关资源
      最近更新 更多