2011-08-25 83 views
7

我正在嘗試使用DeflaterOutputStream將JSON字符串往返傳遞到一個字節數組,但下面的代碼會拋出java.io.EOFException: Unexpected end of ZLIB input streamZLIB輸入流的意外結束

它用於將字符串替換爲「Hello world」,或者如果您從下面的字符串中刪除幾個字符,它就會起作用。

任何想法?

public static void main(String[] args) throws IOException { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    DeflaterOutputStream deflate = new DeflaterOutputStream(bytes, new Deflater(Deflater.BEST_COMPRESSION, true)); 
    OutputStreamWriter writer = new OutputStreamWriter(deflate); 
    writer.write("[1,null,null,\"a\",null,null,null,null,[1,null,null,null,null,null,null,null,null,null,null,null,null,0.0,0.0,null,null]"); 
    writer.flush(); 
    writer.close(); 

    InflaterInputStream inflaterIn = new InflaterInputStream(new ByteArrayInputStream(bytes.toByteArray()), new Inflater(true)); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inflaterIn)); 
    System.out.println(bufferedReader.readLine()); 
} 

Java版本(OSX):

java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode) 

回答

8

我相信這是與你傳遞「真」在DeflaterInflater無論是「無包裝」選項來執行。將它們都設置爲false可以解決這個問題 - 儘管我建議將這兩個地方的字符串編碼設置爲(例如UTF-8),而不是使用系統默認編碼。

爲「NOWRAP」該文檔是相當模糊的,但他們的狀態:

注意:如果使用「nowrap」選項的選擇,還需要提供額外的「虛擬」字節作爲輸入。這是ZLIB本地庫所必需的,以支持某些優化。

想必這虛擬輸入字節丟失,雖然它並不能解釋它應該去...

+0

就是這樣。添加以下修復問題:\t \t bytes.write(0); – slipheed

+0

@slipheed:很高興聽到它:) –

12

我有這個問題,那是因爲我沒有正確關閉我的輸出流。

+6

我有'GZIPOutputStream'類似的問題。寫完壓縮流後,我需要調用'finish()'。 – abellina