返回

解决 ZipInputStream 的 DEFLATED 项限制:解析 ZIP 文件的终极指南

java

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 文件。

常见问题解答

  1. 为什么只有 DEFLATED 项可以具有 EXT 描述符?

    • 这是 Zip 文件格式的一个限制,它要求仅 DEFLATED 项才能具有 EXT 描述符。
  2. 如何确定 ZIP 文件中各个项的压缩方法?

    • 使用 7-Zip 或 WinRAR 等工具,打开 ZIP 文件并查看各个项的属性。
  3. 除了 ZipInputStream,还有哪些用于解压 ZIP 文件的库或工具?

    • jzlib、Apache Commons Compress 和 Zip4j 等库支持各种压缩方法。
  4. 为什么不建议使用反射来解压非 DEFLATED 项?

    • 反射是一种未受支持的技术,可能会导致不可预期的行为和应用程序崩溃。
  5. 如何处理包含非 DEFLATED 项的 ZIP 文件?

    • 使用支持非 DEFLATED 项的库、预处理 ZIP 文件或使用流包装器等方法。