首先,我要承認(rèn)我已經(jīng)在這里和互聯(lián)網(wǎng)上閱讀了幾個(gè)線程,但我的問題仍然存在,而且似乎有所不同。我有一個(gè) zip 文件,其中包含多個(gè) .txt 文件、目錄、該目錄的子目錄等。里面還有大量的 zip 存檔,里面有 zip、目錄和文件。最深層次的歸檔是 5 個(gè)步驟 -> 5 個(gè) zip,一個(gè)包含另一個(gè),其中包含不同的文件。我有這個(gè)代碼: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(); }在歸檔級(jí)別 3 之前,一切似乎都工作正常,列出了所有目錄、zip、gzip 和子目錄,但當(dāng)涉及到處理 input.zip/1.zip/2.zip 之類的內(nèi)容時(shí),它會(huì)拋出異常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.因?yàn)樵讷@取入口程序后就會(huì)拋出異常。在這種情況下,“2.zip”內(nèi)的文件相當(dāng)大 - 800 MB,與最大大小為 3 MB 的其他情況相比 - 我想知道它是否會(huì)影響程序。我試圖在不解壓這些拉鏈的情況下完成所有這些事情,這在這里非常重要。我知道這種錯(cuò)誤通常與損壞的 zip 文件有關(guān),但這些錯(cuò)誤是完全合法的。所以我的問題是 - 我如何瀏覽所有這些嵌套的 zip 文件?編輯/解決方案:根據(jù) Talex 提出的更改,我已經(jīng)修復(fù)了我的代碼,ZipInputStreams使其能夠在標(biāo)準(zhǔn)InputStreams. 它不再拋出錯(cuò)誤,但不知怎的,它仍然跳過比 3 級(jí)歸檔更深的嵌套 zip(仍然不確定這是否是正確的命名方法,哈哈)。解決方案也很簡單 - 當(dāng)我將它循環(huán)傳遞給我的函數(shù)時(shí),我包裝ZipInputStream到另一個(gè)。
1 回答

米琪卡哇伊
TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
代替
processZipFile(stream);
你需要使用
processZipFile(zipInputStream);
添加回答
舉報(bào)
0/150
提交
取消