4

別のスレッドで重い作業(圧縮+ディスクへの書き込み)を行うGZIPOutputStreamの実装はありますか?

大量のGZIP圧縮データを継続的に書き込んでいます。GZIPOutputStreamの代わりに使用できるドロップイン代替品を探しています。

4

2 に答える 2

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) {
    }
}
于 2012-09-21T14:10:50.920 に答える