解决 ZipInputStream 的 DEFLATED 项限制:解析 ZIP 文件的终极指南
2024-03-25 23:13:47
ZipInputStream 困境:解析 ZIP 文件,破解 DEFLATED 项限制
概述
在 Android 中使用 ZipInputStream 解压 ZIP 文件时,你可能会遇到一个异常:"java.util.zip.ZipException: 仅 DEFLATED 项可以具有 EXT 符"。本文将深入探讨导致这一错误的原因,并提供解决方法,帮助你克服 ZipInputStream 的 DEFLATED 项限制。
DEFLATED 压缩算法与 EXT 符
DEFLATED 压缩算法 是一种广泛应用的无损数据压缩算法,用于 ZIP 文件中数据的压缩。
EXT 描述符 是一种可选的 ZIP 文件元数据,存储在 ZIP 项的末尾。它包含有关该项的附加信息,例如 CRC32 校验和。
原因:ZipInputStream 仅支持 DEFLATED 项
ZipInputStream 仅支持解压使用 DEFLATED 压缩算法的 ZIP 项。如果 ZIP 文件中的某项使用其他压缩算法(如 STORE),就会触发异常。
解决方法
要解决此错误,需要确保 ZIP 文件中的所有项都使用 DEFLATED 压缩算法。以下是一些可能的解决方法:
- 检查 ZIP 文件的压缩方法: 使用诸如 7-Zip 或 WinRAR 这样的工具,检查 ZIP 文件中各个项的压缩方法。确保所有项都使用 DEFLATED 压缩。
- 使用支持非 DEFLATED 项的库: 替代 ZipInputStream,可以使用支持更多压缩算法的库,例如 jzlib。
- 预处理 ZIP 文件: 将 ZIP 文件解压到一个临时目录,只保留 DEFLATED 项。然后使用 ZipInputStream 解压临时目录中的文件。
避免使用 ZipInputStream 的场景
如果你不确定 ZIP 文件的压缩方法,或者无法保证所有项都使用 DEFLATED 压缩,则最好避免使用 ZipInputStream。推荐使用 ZipFile 类,因为它支持更广泛的压缩方法。
其他选项
- 流包装器: 使用 InputStreamWrapper 创建一个流包装器,将 ZIP 输入流转换为支持非 DEFLATED 项的流。
- 反射: 使用反射访问 ZipInputStream 的私有方法和字段,允许解压非 DEFLATED 项(但此方法不受支持,可能会导致意外行为)。
目标读者
本文的目标读者是 Android 开发人员,他们遇到了使用 ZipInputStream 解压 ZIP 文件时的 DEFLATED 项限制问题。
结论
克服 ZipInputStream 的 DEFLATED 项限制需要了解 DEFLATED 压缩算法、EXT 描述符和 ZipInputStream 的功能。通过采取本文提供的解决方法,你可以确保在 Android 应用程序中成功解压 ZIP 文件。
常见问题解答
-
为什么只有 DEFLATED 项可以具有 EXT 描述符?
- 这是 Zip 文件格式的一个限制,它要求仅 DEFLATED 项才能具有 EXT 描述符。
-
如何确定 ZIP 文件中各个项的压缩方法?
- 使用 7-Zip 或 WinRAR 等工具,打开 ZIP 文件并查看各个项的属性。
-
除了 ZipInputStream,还有哪些用于解压 ZIP 文件的库或工具?
- jzlib、Apache Commons Compress 和 Zip4j 等库支持各种压缩方法。
-
为什么不建议使用反射来解压非 DEFLATED 项?
- 反射是一种未受支持的技术,可能会导致不可预期的行为和应用程序崩溃。
-
如何处理包含非 DEFLATED 项的 ZIP 文件?
- 使用支持非 DEFLATED 项的库、预处理 ZIP 文件或使用流包装器等方法。