你应该总是包裹
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。
为了完整起见,值得注意的是,最后子句只要求
close()对
ZipOutputStream。这是因为按照惯例,所有内置Java输出流包装器实现都传播关闭。
编辑
我只是反过来测试了它。事实证明,将
ZipOutputStreamwith
包裹起来
BufferedOutputStream,然后仅调用
write()它(不创建/关闭条目)不会抛出
ZipException。而是生成的ZIP文件将被破坏,其中没有任何条目。



