本文介绍如何通过 java 原生 zip api 逐层打开嵌套 zip(如 x.zip → y.zip → z.zip),直接读取最内层 zip(如 z.zip)的根目录文件列表,全程无需临时解压或写入磁盘。
在处理多层嵌套 ZIP(例如 x.zip 中包含 y.zip,其内部又包含 z.zip)时,常见误区是先解压中间层再读取——这不仅低效、占用磁盘空间,还可能因权限或路径问题失败。Java 提供了更优雅的方案:利用 ZipFile.getInputStream(ZipEntry) 获取嵌套 ZIP 条目的字节流,并将其作为 ZipInputStream 的输入源,实现“流式嵌套解析”。
核心思路是递归穿透 ZIP 层级:
- 外层使用 ZipFile(支持随机访问,高效定位入口);
- 每进入下一层 ZIP,用上一层 ZipEntry 的输入流构造新的 ZipInputStream;
- 最终到达目标 ZIP 后,遍历其全部 ZipEntry 并提取 getName()。
以下为精简可运行的示例代码(已优化原始逻辑,增强健壮性与可读性):