为什么我在使用java.util.zip.ZipFile打开一个空的ZIP文件时遇到异常?

时间:2008-12-12 15:09:44

标签: java exception zip zipfile

我想打开一个没有java.util.zip.ZipFile条目的ZIP文件。但是在构造函数上,我得到以下异常:'java.util.zip.ZipException:打开zip文件时出错'。如何打开空ZIP?

该ZIP文件是由linux下的命令行zip程序创建的。我只是删除了ZIP文件中的所有条目。

我需要这个作为我写的类的testdata。该类应该只为这种情况返回一个空列表,但是破损的ZIP文件应该返回错误。

有关该问题的更多解释。我有一个界面,用于从不同的来源提取一些文件。其他实现从webservices或目录收集它们,这个实现来自ZIP文件。该界面为迭代器提供了更多功能。所以我想决定,如果ZIP文件是空的还是坏了。

7 个答案:

答案 0 :(得分:5)

hack:你可以假设所有空的ZIP都是相同的,只需硬编码它的长度/ chechsum即可验证。

答案 1 :(得分:2)

我不知道为什么这样实现,但为什么你需要成功打开一个空的Zip文件?无论如何,你无法用java.util.zip.ZipFile修改它......

所以你可以捕获ZipException(对于无效的格式zip文件抛出),如果你抓住它就跳过该文件。

答案 2 :(得分:2)

我现在解决这个问题的方法是,我只使用ZipInputStream而不是ZipFile。这个类适用于空的ZIP文件。我不知道原因,为什么一个有效,另一个没有。

答案 3 :(得分:1)

我认为ZipInputStream工作的原因和ZipFile没有的原因是因为读取zip文件的两种不同方式。 ZipFile构造函数尝试读取ZipFile的目录,该目录写入文件的末尾。如果它无法读取TOC,它会抛出一个ZipException(其中几乎没有包含有用的信息),我认为这就是你所看到的。但是,ZipInputStream从文件的开头依次读取zip文件中的条目,因此在这种情况下看起来更健壮。

这一切都记录很差,我自己使用ZipFile遇到了类似的问题。从zip文件中读取这两种方法都是有效的,但您认为API文档会提到随机访问/ TOC方法读取构造函数与读取ZipInputStream的含义。

答案 4 :(得分:0)

您确定它是有效的zip文件吗?那是我的第一次猜测。

答案 5 :(得分:0)

ZIP文件格式有错误check the JDK here

答案 6 :(得分:-1)

使用ZipOutputStream