为了账号安全,请及时绑定邮箱和手机立即绑定

Java ZipInputStream 抛出 zip.ZipException:解析嵌套 zip 文

Java ZipInputStream 抛出 zip.ZipException:解析嵌套 zip 文

撒科打诨 2024-01-05 10:49:03
首先,我要承认我已经在这里和互联网上阅读了几个线程,但我的问题仍然存在,而且似乎有所不同。我有一个 zip 文件,其中包含多个 .txt 文件、目录、该目录的子目录等。里面还有大量的 zip 存档,里面有 zip、目录和文件。最深层次的归档是 5 个步骤 -> 5 个 zip,一个包含另一个,其中包含不同的文件。我有这个代码:ZipFile zipFile = new ZipFile(Objects.requireNonNull(this.classLoader.getResource("inputs.zip")).getFile());    Enumeration<? extends ZipEntry> entries = zipFile.entries();    while (entries.hasMoreElements()) {        ZipEntry entry = entries.nextElement();        InputStream stream = zipFile.getInputStream(entry);        System.out.println(entry.getName());        processZipFile(stream);    }这是 processZipFile:private void processZipFile(InputStream stream) throws IOException {    ZipInputStream zipInputStream = new ZipInputStream(stream);    ZipEntry zipEntry = zipInputStream.getNextEntry();    while (zipEntry != null) {        System.out.print("    /" + zipEntry.getName());        if (zipEntry.getName().endsWith(".zip")) {            processZipFile(stream);        }        zipEntry = zipInputStream.getNextEntry();    }在归档级别 3 之前,一切似乎都工作正常,列出了所有目录、zip、gzip 和子目录,但当涉及到处理 input.zip/1.zip/2.zip 之类的内容时,它会抛出异常Exception in thread "main" java.util.zip.ZipException: invalid distance too far back正如我在 Java 8 文档中读到的ZipInputStream.getNextEntry(): Reads the next ZIP file entry and positions the stream at the beginning of the entry data.因为在获取入口程序后就会抛出异常。在这种情况下,“2.zip”内的文件相当大 - 800 MB,与最大大小为 3 MB 的其他情况相比 - 我想知道它是否会影响程序。我试图在不解压这些拉链的情况下完成所有这些事情,这在这里非常重要。我知道这种错误通常与损坏的 zip 文件有关,但这些错误是完全合法的。所以我的问题是 - 我如何浏览所有这些嵌套的 zip 文件?编辑/解决方案:根据 Talex 提出的更改,我已经修复了我的代码,ZipInputStreams使其能够在标准InputStreams. 它不再抛出错误,但不知怎的,它仍然跳过比 3 级归档更深的嵌套 zip(仍然不确定这是否是正确的命名方法,哈哈)。解决方案也很简单 - 当我将它循环传递给我的函数时,我包装ZipInputStream到另一个。
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

代替

processZipFile(stream);

你需要使用

processZipFile(zipInputStream);


查看完整回答
反对 回复 2024-01-05
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信