使用java.util.zip.Deflater的deflate方法时,需要提供一个byte[]作为参数,这个byte[]应该初始化多大呢?我读过,没有保证压缩后的数据一定比未压缩的数据更小。有没有输入量的特定百分比可以参考?
目前,我将其初始化为输入量的两倍。
在调用deflate
之后,调用finished
来查看它是否还有更多的输出。例如:
byte[] buffer = new byte[BUFFER_SIZE];
while (!deflater.finished()) {
int n = deflater.deflate(buffer);
// deal with the n bytes in out here
}
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();
为什么Java把类拼错成了“deflater”?正确的单词应该是“deflator”。唉!抱歉,我得发泄一下。
正如所述,预期的使用方法是不断调用deflate
直到从压缩中获取所有输出。然而,如果你真的想在一个调用中完成,那么deflate可以扩展数据的数量有一个上限。在zlib中有一个函数,Java不幸没有提供,叫做deflateBound()
,它提供了这个上限。你可以使用该函数提供的保守上限,相关行在此处复制:
complen = sourceLen +
((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
ByteArrayOutputStream
,然后每次迭代时使用bos.append(out, 0, n)
将结果附加到其中。 - Adam Batkin