2015-10-27 57 views
0

this thread的幫助下,我能夠編寫decompress()compress()函數。我的程序以gzip形式接收數據,膨脹它,有時修改它,然後再次壓縮併發送它。經過數小時的頭痛和錯誤追蹤,我能夠發現有時(!),我使用的GZIPOutputStream只是不能正常關閉。我能夠沖洗它,但之後,沒有任何反應。然而,在其他時候,它只是工作>。>Java gzip - GZIPOutputStream沒有任意關閉/壓縮

這是我的compress()方法的代碼。

public static byte[] compress(String data) throws IOException { 
    try (PipedInputStream pipedIn = new PipedInputStream(); 
      GZIPOutputStream compressor= new GZIPOutputStream(new PipedOutputStream(pipedIn))) { 
     compressor.write(data.getBytes("UTF-8")); 
     compressor.flush(); 
     compressor.close(); 

     // Sometimes does not reach this point. 

     return IOUtils.toByteArray(pipedIn); 
    } 
} 

爲了調試的目的,我添加了一些System.Outs。控制檯輸出如下:

------------------------------------ 
Decompressing ... 
compressed byte count: 628 
uncompressed byte count: 1072 
------------------------------------ 
Compressing ... 
uncompressed byte count: 1072 
compressed byte count: 628 
------------------------------------ 
>>> That worked! 
------------------------------------ 
Decompressing ... 
compressed byte count: 526 
uncompressed byte count: 2629 
------------------------------------ 
uncompressed byte count: 2629 
compressed byte count: 526 
------------------------------------ 
>>> That worked! 
------------------------------------ 
Decompressing ... 
compressed byte count: 1888 
uncompressed byte count: 6254 
------------------------------------ 

之後,沒有任何反應。任何有關這個問題的幫助將不勝感激!

回答

1

您的GZIP流的使用可能沒有問題;而是你使用管道流的方式。這些是用於線程間通信的,當你以你的方式使用它們時會被阻塞。

取而代之的是使用ByteArrayOutptuStream來捕獲輸出。

+0

你能舉個簡單的例子來說明怎麼做嗎?我想首先這樣做,但我不知道如何從'OutputStream'中將數據獲取到'InputStream'中。 *編輯:如果所有失敗,我會打開另一個線程來管信息。 – dadoosh

+1

['ByteArrayOutputStream#toByteArray()'](http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html#toByteArray())是您所需要的。 –

+0

非常感謝!像現在的魅力一樣工作:) – dadoosh