代码之家  ›  专栏  ›  技术社区  ›  Clox

爪哇-压缩输出的尺寸

  •  5
  • Clox  · 技术社区  · 15 年前

    当使用java.util.zip.deflater的deflate方法时,必须提供一个byte[]作为参数,该byte[]应初始化为多大?我已经读到,不能保证压缩后的数据比未压缩的数据更小。是否有一定百分比的输入应该使用? 目前我把它做成输入的两倍

    2 回复  |  直到 15 年前
        1
  •  8
  •   AbuZubair    12 年前

    打电话后 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();
    
        2
  •  7
  •   Mark Adler    9 年前

    为什么Java把这个类误认为是“通缩器”?这个词是“平减指数”。天哪!对不起,我得把它从我胸口拿开。

    如前所述,预期用途是持续呼叫 deflate 直到你从压缩中得到所有的输出。但是,如果你 真的? 如果想在一次调用中进行此操作,那么deflate可以通过一个绑定来扩展数据。中有一个函数 zlib 不幸的是,Java不能被调用。 deflateBound() 这就提供了上限。您只需使用该函数的保守界限,并在此处复制相关行:

    complen = sourceLen +
              ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;