何时使用deflateroutputstream的deflate()?

sycxhyv7  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(315)

我正在努力学习如何使用deflateroutputstream作为消磨寒假时间的工具。我很困惑,因为当我看文件的时候,https://docs.oracle.com/javase/7/docs/api/java/util/zip/deflateroutputstream.html,它表示deflate()用于将压缩数据写入outputstream,而write()用于将数据写入要压缩的deflateroutputstream(compressed outputstream)。
不过,我在网上查看示例代码,但根本没有人使用deflate()。到目前为止,我看到的所有代码都只是将()写入deflateroutputstream,而不调用deflate()。https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.deflateroutputstream

我注意到代码将fileoutputstream放在deflateroutputstream中,但是它是如何交互的呢?当数据写入deflateroutputstream时,它是否自动调用deflate()将压缩数据发送到fileoutputstream?

ql3eal8s

ql3eal8s1#

是的 protected :它适用于任何子类化该流的内容,而您并没有子类化它,因此就您而言,它是一个实现细节,您不能将其包含在推理中,也不能让您调用。
当然,除非你把它分类。
你可以-这是一个工具箱,用于在上面构建基于lz的压缩流。这就是gzipoutputstream和zipoutputstream扩展它的原因:它们是不同的容器,或多或少使用相同的压缩技术。他们确实援引了这一点 deflate . 除非您正在开发自己的基于lz的压缩系统,或者为现有的、非zip、非gz、非deflater的压缩格式实现读取器,否则这并不适合您。
这些类型的输出流称为“filterstreams”:它们本身并不表示任何资源,而是围绕一个资源。他们可以把任何东西包起来 OutputStream (或任何 InputStream ,这个概念可以说是在“两边”工作),并在传输中修改字节。 var out = new DeflaterOutputStream(whatever) 创建一个新的deflater流,它将压缩您发送给它的任何数据(通过 out.write(stuff) ),它将依次接收压缩数据并将其发送到任何位置。它的工作是:
以字节为单位(根据 out.write ),尽可能多地缓冲:
... 压缩这些数据。
然后,在压缩数据被压缩时,通过将其发送到 Package 的outputstream来处理压缩数据( whatever ,在本例中) write 方法。
基本用法是:
创建资源,例如 Files.newOutputStream 或者 someSocket.getOutputStream 或者 httpServletResponse.getOutputStream() 或者 System.out 或者任何产生流的东西——这是一个抽象的概念,有一个原因:使事物变得灵活。
将资源 Package 成 DeflaterOutputStream 将所有数据写入deflateroutputstream。忘记原来的-你做了它,这样你就可以把它传递给deflateroutputstream,这就是你与底层流的交互结束的地方。
关闭deflaterstream(最终也会关闭底层流)。

相关问题