2012-10-25 124 views
1

所以我有一個輸入流,我從中讀取一個較小的固定大小的緩衝區,我試圖在一個Runnable類中放氣。Java Deflater總是返回0問題

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()。它是否正確?

回答

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); 

希望這會有所幫助。

+0

即使我正在壓縮的塊不是來自輸入流的最後一個,仍應該調用finish()方法嗎? – bph

+0

@bph我在答案中增加了更多內容。我認爲在之後調用'finish()'和'deflate(output)'之前,你需要添加所有的輸入。 –

+0

即使我調用完成,compressedDataLength仍然爲0,並且具有該壓縮級別。 – bph

0

您需要致電compresser.finish()以獲得最終輸出。看到Javadoc。如果您有多個緩衝區,則最好使用DeflaterInputStream