GZIPOutputStream在单独的线程中进行压缩

krl*_*mlr 3 java compression multithreading gzipoutputstream

是否有一个GZIPOutputStream的实现,可以在一个单独的线程中进行繁重的工作(压缩+写入磁盘)?

我们不断编写大量的GZIP压缩数据.我正在寻找可替代GZIPOutputStream的替代品.

Pet*_*rey 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) {
    }
}
Run Code Online (Sandbox Code Playgroud)