In Java does it matter whether I instantiate a ZipOutputStream first, or the BufferedOutputStream first? Example:
FileOutputStream dest = new FileOutputStream(fi
You should always wrap the BufferedOutputStream
with the ZipOutputStream
, never the other way around. See the below code:
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();
}
As the comments say the putNextEntry()
and closeEntry()
methods are not available on the BufferedOutputStream
. Without calling those methods ZipOutputStream
throws an exception java.util.zip.ZipException: no current ZIP entry
.
For the sake of completeness, it is worth noting that the finally clause only calls close()
on the ZipOutputStream
. This is because by convention all built-in Java output stream wrapper implementations propagate closing.
I just tested it the other way around. It turns out that wrapping a ZipOutputStream
with BufferedOutputStream
and then only calling write()
on it (without creating / closing entries) will not throw a ZipException
. Instead the resulting ZIP file will be corrupt, without any entries inside it.