当使用java.util.zip.Deflater的deflate-method时,必须提供byte []作为参数,该byte []被初始化为多大?我已经读过,不能保证压缩数据甚至会比未压缩数据小。是否应该使用一定比例的输入? 目前我的输入值是输入的两倍
答案 0 :(得分:8)
致电deflate
后,请致电finished
查看是否仍有更多要输出的内容。例如:
byte[] buffer = new byte[BUFFER_SIZE];
while (!deflater.finished()) {
int n = deflater.deflate(buffer);
// deal with the n bytes in out here
}
如果您只想收集内存中的所有字节,可以使用ByteArrayOutputStream。例如:
byte[] buffer = new byte[BUFFER_SIZE];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while (!deflater.finished()) {
int n = deflater.deflate(buffer);
baos.write(buffer, 0, n);
}
return baos.toByteArray();
答案 1 :(得分:7)
为什么Java会将课程拼错为“deflater”?这个词是“平减指数”。哎呀!对不起,不得不放弃我的胸膛。
如上所述,预期用途是继续调用deflate
,直到获得压缩的所有输出。但是,如果确实希望在一次调用中执行此操作,则deflate可以扩展数据的数量受到限制。在zlib中有一个函数,遗憾的是Java不提供名为deflateBound()
的函数,它提供了上限。您可以使用该函数的保守界限,并在此处复制相关行:
complen = sourceLen +
((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;