Preferred way to use Java ZipOutputStream and BufferedOutputStream

后端 未结 2 1664
终归单人心
终归单人心 2021-02-01 00:37

In Java does it matter whether I instantiate a ZipOutputStream first, or the BufferedOutputStream first? Example:

FileOutputStream dest = new FileOutputStream(fi         


        
2条回答
  •  野趣味
    野趣味 (楼主)
    2021-02-01 01:17

    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.

    EDIT

    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.

提交回复
热议问题