如何在java中使用任何类型的OutputStream实现最高性能?

时间:2009-09-27 01:33:18

标签: java performance api

我需要写数据块(字符),我不关心这些块的顺序。我想知道我应该用什么样的OutputStream来实现高性能?

4 个答案:

答案 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

更新:我假设一个线程将打开流和条目,然后很多人会写,然后一个线程将关闭它。