Java - 压缩输出的大小 - byteArray

时间:2009-07-30 16:50:40

标签: java size deflate

当使用java.util.zip.Deflater的deflate-method时,必须提供byte []作为参数,该byte []被初始化为多大?我已经读过,不能保证压缩数据甚至会比未压缩数据小。是否应该使用一定比例的输入? 目前我的输入值是输入的两倍

2 个答案:

答案 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;