在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中看不到任何说明这些方法之一是必需的还是首选的信息。有什么建议吗?似乎先压缩输出,然后将其缓冲以进行写操作会更有效。
你应该总是包裹BufferedOutputStream用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将引发异常java.util.zip.ZipException: no current ZIP entry。
putNextEntry()
closeEntry()
java.util.zip.ZipException: no current ZIP entry
为了完整起见,值得注意的是,最后子句只要求close()对ZipOutputStream。这是因为按照惯例,所有内置Java输出流包装器实现都传播关闭。
close()
我只是反过来测试了它。事实证明,将ZipOutputStreamwith 包裹起来BufferedOutputStream,然后仅调用write()它(不创建/关闭条目)不会抛出ZipException。而是生成的ZIP文件将被破坏,其中没有任何条目。
write()
ZipException