随机访问 ZIP 文件中的文件块

Random access to chunks of a file inside a ZIP

我一直在试验 ZIP 格式,特别是随机访问其中的内容。

我知道 ZIP 支持随机访问,但据我所知,这仅适用于 ZIP 存档内的完整文件。

我想知道是否可以只加载 ZIP 文件中的一部分文件,而不将整个子文件加载到内存中

注意:我只使用非压缩 zip 文件

如果您在 Windows 或 POSIX-compatible 系统(如 Linux)上 运行,则可以使用 memory-mapped 文件。 使用此解决方案,ZIP 文件将被映射到虚拟内存,这样您就可以遍历其内容 而无需在内存中加载和解析整个文件 。 您可以找到更多信息 here and there。现在大多数现代操作系统都实现了这一点。

虽然 memory-mapped 文件很棒,因为它可以与许多现有工具集成,但您可以 使用 low-level 搜索和读取 自己阅读文件。由于文件未压缩,您可以:

  • 首先,阅读 zip header(在 zip 的末尾)以找到目标文件的位置;
  • 然后,读取文件header得到文件的大小,检查是否真的没有压缩
  • 最后,检索相对于目标文件数据偏移量的目标数据块(从文件header之后开始)。

zip 数据格式的普通文件是连续写入的,可以安全地检索。

您可以找到有关 ZIP 文件格式的更多信息 here