Java Deflater总是返回0问题

时间:2012-10-25 21:07:48

标签: java

所以我有一个输入流,我从中读取一个较小的固定大小的缓冲区,我试图在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()。这是对的吗?

2 个答案:

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