小编典典

使用Java ZipOutputStream和BufferedOutputStream的首选方法

java

在Java中,先实例化ZipOutputStream还是先实例化BufferedOutputStream
无关紧要?例:

FileOutputStream dest = new FileOutputStream(file);
ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(dest));

// use zip output stream to write to

要么:

FileOutputStream dest = new FileOutputStream(file);
BufferedOutputStream out = new BufferedOutputStream(new ZipOutputStream(dest));

// use buffered stream to write to

在我不科学的时光里,我似乎并没有说出太多区别。我在Java
API中看不到任何说明这些方法之一是必需的还是首选的信息。有什么建议吗?似乎先压缩输出,然后将其缓冲以进行写操作会更有效。


阅读 617

收藏
2020-12-03

共1个答案

小编典典

你应该总是包裹BufferedOutputStreamZipOutputStream,绝不是相反。请参见以下代码:

FileOutputStream fos = new FileOutputStream("hello-world.zip");
BufferedOutputStream bos = new BufferedOutputStream(fos);
ZipOutputStream zos = new ZipOutputStream(bos);

try {
    for (int i = 0; i < 10; i++) {
        // not available on BufferedOutputStream
        zos.putNextEntry(new ZipEntry("hello-world." + i + ".txt"));
        zos.write("Hello World!".getBytes());
        // not available on BufferedOutputStream
        zos.closeEntry();
    }
}
finally {
    zos.close();
}

如评论所述,putNextEntry()closeEntry()方法在上不可用BufferedOutputStream。不调用这些方法ZipOutputStream将引发异常java.util.zip.ZipException: no current ZIP entry

为了完整起见,值得注意的是,最后子句只要求close()ZipOutputStream。这是因为按照惯例,所有内置Java输出流包装器实现都传播关闭。

编辑

我只是反过来测试了它。事实证明,将ZipOutputStreamwith
包裹起来BufferedOutputStream,然后仅调用write()它(不创建/关闭条目)不会抛出ZipException。而是生成的ZIP文件将被破坏,其中没有任何条目。

2020-12-03