首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭ZipOutputStream

关闭ZipOutputStream
EN

Stack Overflow用户
提问于 2011-01-13 23:01:34
回答 4查看 20.7K关注 0票数 11

我有点困惑。我知道空拉链是不合法的。但是下面的示例片段如何呢:

代码语言:javascript
复制
ZipOutputStream zos = null; 
try
{
    zos = new ZipOutputStream(new FileOutputStream("..."));
    //
    //..
    //
}
finally
{
    zos.close();
}

如果由于某种原因(可能是异常情况)没有添加zip条目,则在尝试关闭时将抛出以下异常:

代码语言:javascript
复制
Exception in thread "main" java.util.zip.ZipException: ZIP file must have at least one entry
    at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:304)
    at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:146)
    at java.util.zip.ZipOutputStream.close(ZipOutputStream.java:321)

在这种情况下,关闭流的最干净的方法是什么?

谢谢..。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-13 23:14:30

您应该关闭FileOutputStream,而不是ZipOutputStream,因为前者实际消耗系统资源。

代码语言:javascript
复制
File zipFile = new File("/tmp/example.zip");
FileOutputStream fos = null;
try
{
   fos = new FileOutputStream(zipFile);
   ZipOutputStream zos = new ZipOutputStream(fos);

   // ...

   zos.close();
}
catch (IOException ex)
{
   // log/report exception, then delete the invalid file
   IOUtils.closeQuietly(fos);
   zipFile.delete();
}
finally
{
   IOUtils.closeQuietly(fos);
}

Jakarta Commons IO中可以找到IOUtils类。使用它意味着您不必处理close()可能抛出的可能但很少有用的IOException

票数 8
EN

Stack Overflow用户

发布于 2011-01-13 23:08:32

你应该跟踪是否在zip流中添加了内容,并仅在添加内容时才将其关闭:

代码语言:javascript
复制
ZipOutputStream zos = null; 
OutputStream file = new FileOutputStream("...")
int itemsAdded=0;
try
{
    zos = new ZipOutputStream(file);
    //
    //..
    // itemsAdded++; 
}
finally
{
    if ( itemsAdded > 0 ) {
         zos.close();
    } else {
         file.close();
    }
}

如果不需要计数,只需使用boolean标志即可。

票数 4
EN

Stack Overflow用户

发布于 2012-05-17 11:13:43

我所做的不是仅在添加内容时关闭流,而是在运行邮政编码之前进行条件检查,以查看是否有要压缩的内容。这帮助我简化了过程,我认为一般可以用来处理"ZIP文件必须至少有一个条目“的问题。确实,关闭zos可能会抛出其他异常,但这种情况很少见。

我认为这是Java的问题,当没有文件需要压缩时,Java不能处理这种情况。

即:

代码语言:javascript
复制
int itemsToAdd=0;
//....

if ( itemsToAdd > 0 ) {

    ZipOutputStream zos = new ZipOutputStream(file);
    try {
        //add files to zip
    }
    finally {
        zos.close();
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4681459

复制
相关文章

相似问题

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