我正在努力学习如何使用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?
1条答案
按热度按时间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(最终也会关闭底层流)。