是否有GZIPOutputStream的實現可以在單獨的線程中完成繁重的工作(壓縮+寫入磁盤)?GZIPOutputStream在單獨的線程中執行壓縮操作
我們不斷編寫大量的GZIP壓縮數據。我正在尋找一個可以替代GZIPOutputStream的替代品。
是否有GZIPOutputStream的實現可以在單獨的線程中完成繁重的工作(壓縮+寫入磁盤)?GZIPOutputStream在單獨的線程中執行壓縮操作
我們不斷編寫大量的GZIP壓縮數據。我正在尋找一個可以替代GZIPOutputStream的替代品。
您可以寫入一個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) {
}
}
這比我的回答好得多:) –
聽起來很有希望。你如何將'PipedInputStream'附加到'GZIPOutputStream'(都在工作線程中)?有這種用途的高效流複印機嗎? – krlmlr
我已經添加了一個示例實現。 –
啊,糾正我,如果我錯了,但不能你簡單地自己包裝GZIPOutputStream? – Femi
GZIPOutputStream不會向磁盤寫入任何內容。 –
@JBNizet:對,我很困惑。 – krlmlr