2012-09-21 86 views
2

是否有GZIPOutputStream的實現可以在單獨的線程中完成繁重的工作(壓縮+寫入磁盤)?GZIPOutputStream在單獨的線程中執行壓縮操作

我們不斷編寫大量的GZIP壓縮數據。我正在尋找一個可以替代GZIPOutputStream的替代品。

+1

啊,糾正我,如果我錯了,但不能你簡單地自己包裝GZIPOutputStream? – Femi

+0

GZIPOutputStream不會向磁盤寫入任何內容。 –

+0

@JBNizet:對,我很困惑。 – krlmlr

回答

5

您可以寫入一個PipedOutputStream並擁有一個讀取PipedInputStream並將其複製到您喜歡的任何流的線程。

這是一個通用的實現。您給它一個OutputStream來寫入,並返回一個OutputStream供您寫入。

public static OutputStream asyncOutputStream(final OutputStream out) throws IOException { 
    PipedOutputStream pos = new PipedOutputStream(); 
    final PipedInputStream pis = new PipedInputStream(pos); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       byte[] bytes = new byte[8192]; 
       for(int len; (len = pis.read(bytes)) > 0;) 
        out.write(bytes, 0, len); 
      } catch(IOException ioe) { 
       ioe.printStackTrace(); 
      } finally { 
       close(pis); 
       close(out); 
      } 
     } 
    }, "async-output-stream").start(); 
    return pos; 
} 

static void close(Closeable closeable) { 
    if (closeable != null) try { 
     closeable.close(); 
    } catch (IOException ignored) { 
    } 
} 
+0

這比我的回答好得多:) –

+0

聽起來很有希望。你如何將'PipedInputStream'附加到'GZIPOutputStream'(都在工作線程中)?有這種用途的高效流複印機嗎? – krlmlr

+0

我已經添加了一個示例實現。 –

相關問題