首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZipOutputStream - closeEntry()优先或close()优先

ZipOutputStream - closeEntry()优先或close()优先
EN

Stack Overflow用户
提问于 2014-05-20 23:36:01
回答 2查看 12.5K关注 0票数 1

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

代码语言:javascript
复制
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)

代码

代码语言:javascript
复制
 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);
                }
            }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-20 23:40:16

考虑使用zipout的方案

代码语言:javascript
复制
zipout = // open zipout someway
// do something with it
zipout.close();

因此,在这个块中,我们对zipout做了一些操作,您应该创建并关闭条目:

代码语言:javascript
复制
ZipEntry z = ...
// do something with it
zipout.closeEntry();

由此产生的方案是:

代码语言:javascript
复制
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();

因此,您应该首先关闭entry,然后关闭zipout

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

票数 7
EN

Stack Overflow用户

发布于 2014-05-20 23:44:29

ZipOutputStream#closeEntry()关闭压缩文件中的当前条目,因为您只有一个条目,所以这并不是什么大问题。如果您需要放入另一个条目,只需先关闭当前条目,然后再放入下一个条目。

ZipOutputStream#close()会完全关闭文件流,当您完成向流中添加内容时使用此选项。

TL;博士把closeEntry()放在第一位,如果你使用它,我甚至不知道是否有必要关闭这种类型的OutputStream的最后一项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23764265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档