使用 Java ZipOutputStream 和 BufferedOutputStream 的首选方法

2022-08-31 15:50:35

在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中看不到任何关于这些方式之一是否必要或首选的内容。有什么建议吗?似乎首先压缩输出,然后缓冲它以进行写入会更有效。


答案 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()BufferedOutputStreamZipOutputStreamjava.util.zip.ZipException: no current ZIP entry

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

编辑

我只是以另一种方式测试了它。事实证明,包装一个 with 然后只调用它(不创建/关闭条目)不会抛出 .相反,生成的ZIP文件将损坏,其中没有任何条目。ZipOutputStreamBufferedOutputStreamwrite()ZipException


答案 2

您应该:

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

因为您希望缓冲对光盘的写入(因为这在大数据块中比在很多小块中更有效)。


new BufferedOutputStream(new ZipOutputStream(dest));

将在压缩之前进行缓冲。但这一切都发生在内存中,不需要缓冲,因为许多小内存访问的速度与一些大内存访问的速度大致相同。在内存中,通常需要的时间与读/写的字节数成正比。

正如评论中提到的:

不属于其中的方法也不可用。例如: 和。ZipOutputStreamBufferedOutputStreamputNextEntrycloseEntry


推荐