我需要写数据块(字符),我不关心这些块的顺序。我想知道我应该用什么样的OutputStream来实现高性能?
答案 0 :(得分:3)
简单地从多个线程调用vanilla ZipOutputStream是行不通的。 ZipOutputStream API有一个模型,您可以按如下方式一次写入一个条目:
ZipOutputStream zos = ...
while (...) {
zos.putNextEntry(...);
while (...) {
zos.write(...);
}
zos.closeEntry();
}
此模型本质上是非线程安全的。
为了以线程安全的方式执行此操作,您需要将ZipOutputStream包装在一个同步方法调用中执行put / write / close操作的类中。这意味着你基本上是在连续地进行Zip输出操作,这在很大程度上违背了你这样做的目的。
答案 1 :(得分:2)
我在做并行图像压缩算法时遇到了类似的情况。您可以创建大量内存块作为输出流,并将压缩数据保存到这些内容并在以后连接它们。其他并行压缩算法(如ECW)也会将压缩块保存到文件中,而在压缩结束时,排序规则任务会将所有块连接在一起。
答案 2 :(得分:1)
java.io.BufferedOutputStream可能是大多数情况下最好的,但实际上使用的是字节(使用BufferedWriter是你想写的字符/字符串)。
注意:这绝对性能取决于堆大小,操作系统,垃圾收集器,缓冲区大小,月亮相位等等......但通常比逐字节写入更好。
正如你所说的那样,你不关心序列,我可能会误解你真正想要做的事情,因为这些事情显然是以顺序的方式对事物进行操作。
答案 3 :(得分:-2)
您可以创建一个包装类 - 即扩展ZipOutputStream并通过覆盖它们使方法同步。例如:
class MyZip extends java.util.zip.ZipOutputStream {
synchronized public void write(byte[] b, int off, int len) throws IOException {
super.write( b, off, len);
}
}
或者,您可以使用现有的解决方案de.schlichtherle.util.zip.ZipOutputStream
更新:我假设一个线程将打开流和条目,然后很多人会写,然后一个线程将关闭它。