ZipOutputStream - closeEntry()first或close()first

时间:2014-05-20 15:36:01

标签: java zipoutputstream

以下是部分代码的一部分。我需要在finally子句中关闭资源。我需要先调用closeEntry()还是close()?我收到一些错误消息。

Error closing the zipoutjava.io.IOException: Stream closed at 
  java.util.zip.ZipOutputStream.ensureOpen(ZipOutputStream.java:70) at 
  java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:189)

代码

 ZipOutputStream zos = null;

  try{

    ZipEntry entry = new ZipEntry("file.csv")
    zipout.putNextEntry(entry);
            csvBeanWriter = new CsvBeanWriter(writer,
                    CsvPreference.STANDARD_PREFERENCE);
            csvBeanWriter.writeHeader(header);
            for (Book book : bookList) {
                csvBeanWriter.write(book, header);
                csvBeanWriterTest.write(book, header);

            }

        } catch (Exception e) {
            logger.error("Export of package data failed: "
                    + e);

        } finally {

            if (zipout != null) {
                try {
                    zos.closeEntry();
                    zos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    logger.error("Error closing the zos"
                            + e);
                }
            }
}

2 个答案:

答案 0 :(得分:5)

考虑使用zipout

的方案
zipout = // open zipout someway
// do something with it
zipout.close();

所以,它是块,我们用zipout做什么你应该创建和关闭条目:

ZipEntry z = ...
// do something with it
zipout.closeEntry();

结果方案是:

zipout = ...

ZipEntry z1 = ...
zipout.putNextEntry(z1);
// write something to zipout
zipout.closeEntry();

ZipEntry z2 = ...
zipout.putNextEntry(z2);
// write something to zipout
zipout.closeEntry();

//...

ZipEntry zN = ...
zipout.putNextEntry(zN);
// write something to zipout
zipout.closeEntry();


zipout.close();

所以,首先应该关闭条目,然后zipout

示例代码:https://community.oracle.com/thread/2097141?start=0

答案 1 :(得分:2)

ZipOutputStream#closeEntry()关闭了zip文件中的当前条目,因为你只有一个条目,所以并不是那么大的交易。如果您需要在其中输入另一个条目,则必须先关闭当前条目,然后再将下一个条目放入。

ZipOutputStream#close()完全关闭文件流,在完成向流中添加内容后使用此功能。

TL; DR 如果您使用closeEntry(),请先放OutputStream,我不知道是否需要关闭此类{{1}的最后一个条目}。