使用Java ZipOutputStream和BufferedOutputStream的首选方法

在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中,我看不到任何东西,如果其中一种方法是必要的或优先的。 有什么build议? 看起来先压缩输出,然后缓冲写入会更有效率。

你应该总是用ZipOutputStream包装BufferedOutputStream ,而ZipOutputStream 。 看下面的代码:

 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抛出一个exceptionjava.util.zip.ZipException: no current ZIP entry

为了完整起见,值得注意的是finally子句只调用ZipOutputStream上的close() 。 这是因为按照惯例,所有内置的Java输出stream包装器实现传播closures。

编辑

我只是用另一种方式来testing它。 事实certificate,用BufferedOutputStream封装ZipOutputStream ,然后只调用write() (不创build/closures条目)不会抛出ZipException 。 相反,生成的ZIP文件将被破坏,而没有任何条目。

你应该:

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

因为你想缓冲写入光盘(因为这在大数据块中比在很多小数据块中效率更高)。


这个

 new BufferedOutputStream(new ZipOutputStream(dest)); 

会在zip压缩之前缓冲。 但是,这一切都发生在内存中,不需要缓冲,因为很多小内存访问与几个大内存访问速度差不多。 在内存中,所需的时间与读/写字节数成正比。

正如在评论中提到的那样:

不属于BufferedOutputStreamZipOutputStream方法也不可用。 例如putNextEntrycloseEntry