是否有一个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) {
}
}
PipedInputStream
附加到GZIPOutputStream
(都在工作线程中)?是否有一个有效的流复制器可以实现此目的? - krlmlrPipedInputStream
是在同一个线程中创建的,与 PipedOutputStream
相同。难道不应该在工作线程中创建它吗? - krlmlr我发布了一些代码,可以完全满足您的需求。一直以来,我对Java无法自动在多个线程之间管道调用感到失望,以便重叠计算、压缩和磁盘I/O:
https://github.com/lukehutch/PipelinedOutputStream
这个类将写入OutputStream
的过程拆分为生产者和消费者线程(实际上,为消费者启动了一个新线程),并在它们之间插入了一个阻塞有界缓冲区。虽然在缓冲区之间进行了一些数据复制,但这是尽可能高效地完成的。README.md
所示。