为什么使用 java.util.zip.ZipFile 打开空 ZIP 文件时出现异常?

发布于 2024-07-10 18:56:23 字数 394 浏览 7 评论 0原文

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

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

我需要这个作为我编写的类的测试数据。 对于这种情况,该类应该简单地返回一个空列表,但损坏的 ZIP 文件应该返回一个错误。

有关该问题的更多解释。 我有一个界面,用于从不同来源提取一些文档。 其他实现从 Web 服务或目录收集它们,此实现从 ZIP 文件收集。 该接口为迭代器提供了更多功能。 所以我想决定 ZIP 文件是否为空或已损坏。

I want to open a ZIP-file, that have no entries with java.util.zip.ZipFile. But on the constructor I get the following exception: 'java.util.zip.ZipException: error in opening zip file'. How can I open the empty ZIP?

That ZIP-file is created by the commandline zip-program under linux. I simply deleted all entries from a ZIP-file.

I need this as testdata for a class I write. The class should simply return an empty list for this case, but broken ZIP-files should return an error.

For some more explanation on the problem. I have an interface, for extracting some documents from different sources. Other implementations gather them from webservices or directories, this implementation from ZIP-files. The interface give an Iterator with some more functionality. So I want to decide, if the ZIP-file is empty or broken.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

み格子的夏天 2024-07-17 18:56:23

hack:您可以假设所有空 ZIP 都是相同的,只需对其长度/校验和进行硬编码即可进行验证。

hack: you can assume that all empty ZIPs are the same and just hardcode it's length/chechsum to validate against.

不必你懂 2024-07-17 18:56:23

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

因此您可以捕获 ZipException(因无效格式的 zip 文件而引发),并在捕获它时跳过该文件。

I don't know why is it implemented this way, but why do you need to succesfully open an empty Zip file? You can't modify it with java.util.zip.ZipFile anyway...

So you can just catch the ZipException (which is thrown for invalid format zip files), and skip the file if you catch it.

后来的我们 2024-07-17 18:56:23

我现在对这个问题的解决方案是,我简单地使用 ZipInputStream 而不是 ZipFile。 此类适用于空 ZIP 文件。 我不知道原因,为什么一个有效而另一个无效。

My solution for this problem is now, that I simply use ZipInputStream instead of ZipFile. This class works well with empty ZIP-files. I don't know about the reason, why one works and the other not.

眼波传意 2024-07-17 18:56:23

我认为 ZipInputStream 有效而 ZipFile 无效的原因是因为 zip 文件的读取方式有两种不同。 ZipFile 构造函数尝试读取写入到文件末尾的 ZipFile 目录。 如果它无法读取目录,它会抛出一个 ZipException (其中几乎不包含任何有用的信息),我认为这就是您所看到的。 然而,ZipInputStream 从 zip 文件的开头开始按顺序读取条目,因此在这种情况下它看起来更健壮。

这些都没有很好的记录,我自己在使用 ZipFile 时也遇到过类似的问题。 从 zip 文件读取的两种方法都是有效的,但您可能认为 API 文档会提到通过构造函数读取的随机访问/TOC 方法与通过 ZipInputStream 读取的随机访问/TOC 方法的含义。

I think the reason ZipInputStream works and ZipFile does not is because of the two different ways that zip files are read. The ZipFile constructor attempts to read the ZipFile's table of contents, which is written to the end of the file. If it can't read the TOC, it throws a ZipException (with almost no helpful info contained therein), which I think is what you're seeing. ZipInputStream, however, reads the entries out of the zip file sequentially starting at the beginning of the file, so it seems more robust in this case.

This is all very poorly documented and I've run into similar problems myself using ZipFile. Both methods of reading from a zip file are valid, but you'd think the API docs would mention the implications of the random access/TOC method of reading through constructor versus reading through a ZipInputStream.

念三年u 2024-07-17 18:56:23

您确定这是一个有效的 zip 文件吗? 这是我的第一个猜测。

Are you sure it is a valid zip file? That would be my first guess.

尐籹人 2024-07-17 18:56:23

ZIP 文件格式有错误 在此处检查 JDK

The ZIP file format has errors check the JDK here.

懒的傷心 2024-07-17 18:56:23

使用ZipOutputStream

Use a ZipOutputStream.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文