使用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压缩之前缓冲。 但是,这一切都发生在内存中,不需要缓冲,因为很多小内存访问与几个大内存访问速度差不多。 在内存中,所需的时间与读/写字节数成正比。
正如在评论中提到的那样:
不属于BufferedOutputStream
的ZipOutputStream
方法也不可用。 例如putNextEntry
和closeEntry
。