使用 Java ZipOutputStream 和 BufferedOutputStream 的首选方式

2023-12-30

在Java中,我是否实例化一个有关系吗?压缩输出流 http://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipOutputStream.html首先,或者缓冲输出流 http://docs.oracle.com/javase/8/docs/api/java/io/BufferedOutputStream.html第一的?例子:

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

// use zip output stream to write to

Or:

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

// use buffered stream to write to

在我的非科学时间安排中,我似乎无法看出这里有多大区别。我在 Java API 中看不到任何说明这些方法之一是否必要或首选的内容。有什么建议吗?看起来首先压缩输出然后缓冲它以进行写入会更有效。


你应该总是包裹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() and closeEntry()方法不可用BufferedOutputStream。不调用这些方法ZipOutputStream抛出异常java.util.zip.ZipException: no current ZIP entry.

为了完整起见,值得注意的是,finally 子句仅调用close() on the ZipOutputStream。这是因为按照惯例,所有内置 Java 输出流包装器实现都会传播关闭。

EDIT

我刚刚以相反的方式测试了它。事实证明,包裹一个ZipOutputStream with BufferedOutputStream然后只调用write()在它上面(不创建/关闭条目)不会抛出ZipException。相反,生成的 ZIP 文件将被损坏,其中没有任何条目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Java ZipOutputStream 和 BufferedOutputStream 的首选方式 的相关文章

随机推荐