以下是文档中的示例:

 byte[] output = new byte[100];
 Deflater compresser = new Deflater();
 compresser.setInput(input);
 compresser.finish();
 int compressedDataLength = compresser.deflate(output);
 compresser.end();

DeflaterOutputStream做的是这样的:

        if (!def.finished()) {
            def.setInput(b, off, len);
            while (!def.needsInput()) {
                 int len = def.deflate(buf, 0, buf.length);
                 if (len > 0) {
                 out.write(buf, 0, len);
               }
            }
        }

这让我认为,仅仅因为调用deflate()得到了非零的返回并不意味着您的整个输入都被压缩了.

这样对吗?在文档中,我很难找到明确提到这一点的地方.

推荐答案

如果不给它足够的输出空间,它就不会完成.您需要使用更多的输出空间继续呼叫deflate(),直到finished()为真.

请注意,如果您没有告诉它您已经提供了finish()的所有输入,它将永远不会报告它已经完成.这个例子就是这么做的.

Java相关问答推荐

那么比较似乎不是词典学的,尽管doctor 这么说

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

Java JAR环境(JRE)是否支持模块?

我的scala文件失败了Scala.g4 ANTLR语法

JsonPath在多个线程中返回错误的值

强制Mockito返回null而不是emtpy list

Spring boot:Bean和动态扩展器

Java中后期绑定的替代概念

有关手动创建的包的问题

AssertJ Java:多条件断言

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

如何在Java中从XML中获取特定的 node ,然后将其删除?

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

如何在EL处理器中定义带有命名空间的变量?

Java集合:NPE,即使没有添加空值

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

如何使用Java ZoneID的区域设置?

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

验证没有';t work on Hibernate Entity';s字段