所以我有一个输入流,我从中读取一个较小的固定大小的缓冲区,我试图在Runnable类中进行Deflate。
randomClass implements Runnable {
public void run() {
...
byte[] output = new Byte[FIXED];
Deflater deflater = new Deflater();
deflater.setInput(uncompressed);
deflater.setLevel(Deflater.DEFLATED);
int length = deflater.deflate(output);
...
}
}
我遇到的问题是长度总是返回0,这意味着我根据文档需要更多输入?但是,我已经检查过未压缩的不是null。如何从输出中获取字节?
另外我相信我应该只在最后一个块调用deflater.finish()。这是对的吗?
答案 0 :(得分:1)
我认为应该在compresser.finish();
之后立即调用deflater.setInput(uncompressed);
。然后继续下一步,应该没问题。
同样在documentation中提到如下:
byte[] output = new byte[100];
Deflater compresser = new Deflater();
compresser.setInput(input);
compresser.finish(); //<-- finished is called here
int compressedDataLength = compresser.deflate(output);
另外,请在初始化时设置等级,例如
Deflater compresser = new Deflater(Deflater.DEFLATED, false); //<-set the level
byte[] output = new byte[100];
compresser.setInput(input);
compresser.finish(); //<-- finished is called here
int compressedDataLength = compresser.deflate(output);
希望这有帮助。
答案 1 :(得分:0)
您需要致电compresser.finish()
以获得最终输出。见Javadoc。如果您有多个缓冲区,最好使用DeflaterInputStream
。