如何计算Android中deflater压缩输出的字节大小

时间:2014-09-03 10:58:54

标签: android compression

这是我在Android中使用deflater压缩数据的代码

    String inputString = "kjhdf948w37fh4ifh34789fh34789fh3489fh7348fh84f8h4f3";
    byte[] input = inputString.getBytes("UTF-8");

    // Compress the bytes
    byte[] output = new byte[100];
    Deflater compresser = new Deflater(Deflater.BEST_COMPRESSION);
    compresser.setInput(input);
    compresser.finish();
    int compressedDataLength = compresser.deflate(output);

现在我想修复“输出”字节数组的大小如何设置输出字节数组的大小。请帮我解决这个问题。

  byte[] output = new byte[100];

目前我设置100如何根据输入字节动态计算输出字节数组大小。

2 个答案:

答案 0 :(得分:1)

以下是Deflator文档中的示例代码,它完全符合您的需求:

 Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION);
 deflater.setInput(originalBytes);
 deflater.finish();

 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 byte[] buf = new byte[8192];
 while (!deflater.finished()) {
     int byteCount = deflater.deflate(buf);
     baos.write(buf, 0, byteCount);
 }
 deflater.end();

 byte[] compressedBytes = baos.toByteArray();

由于输出的大小是事先未知的,缓冲区被分配为8K字节(在你的情况下它可能更少)并且有一个循环读取字节并将它们发送到ByteArrayOutputStream,直到所有字节都被读取

最后,使用

获取所有压缩输出
 byte[] compressedBytes = baos.toByteArray();

更简单的方法可能是使用DeflaterOutputStream

try {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION);
    deflater.setInput(originalBytes);
    DeflaterOutputStream dfos = new DeflaterOutputStream(baos, deflater);
    dfos.deflate();
    dfos.close();
    byte[] compressedBytes = baos.toByteArray();
} catch (IOException ex) {
    ex.printStrackTrace();
}

答案 1 :(得分:1)

来自dev guide

 byte[] originalBytes = ...

 Deflater deflater = new Deflater();
 deflater.setInput(originalBytes);
 deflater.finish();

 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 byte[] buf = new byte[8192];
 while (!deflater.finished()) {
     int byteCount = deflater.deflate(buf);
     baos.write(buf, 0, byteCount);
 }
 deflater.end();

 byte[] compressedBytes = baos.toByteArray();

我认为诀窍是将buf尺寸设置得非常小, 因此,您将在ByteArrayOutputStream中收集压缩字节,然后在while循环以正确的数据长度结束时获得压缩字节数组