这是我在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如何根据输入字节动态计算输出字节数组大小。
答案 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)
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循环以正确的数据长度结束时获得压缩字节数组