別のスレッドで重い作業(圧縮+ディスクへの書き込み)を行うGZIPOutputStreamの実装はありますか?
大量のGZIP圧縮データを継続的に書き込んでいます。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) {
}
}