Java ZipInputStream 跳过未使用的 ZipEntry 内容,而不是耗尽它
Java ZipInputStream skipping unused ZipEntry content, rather than draining it
我正在尝试以最佳方式读取 zip 中的 ZipEntry 内容。为了实现这一点,我需要标准 ZipInputStream 来使用 InputStream.skip 不需要的条目内容而不是耗尽它。
只要我从ZIP (file format) wiki 上了解到:
Because the files in a ZIP archive are compressed individually it is possible to extract them, or add new ones, without applying compression or decompression to the entire archive. This contrasts with the format of compressed tar files, for which such random-access processing is not easily possible.
由此我假设在使用 ZIP 解压缩条目的内容之前跳过不需要的内容是确定性的。
但是我看到 ZipInputStream(Java 标准)和 ZipArchiveInputStream(apache) 都在排空流,直到下一个条目而不是跳过它,这使我使用它的效率非常低。
我并不完全了解 ZIP 规范,看到两个主要使用的 ZIP API 的这种行为让我觉得这可能是不可能的。
是我的理解不正确,这样的最佳行为是不可能的,还是 Java API 您对有效阅读 Zip 条目有什么建议?
这里的问题是 ZipInputStream
是一个流。您首先读取第一个条目的 LOC(本地文件头),读取条目(解压缩、校验和等),重复直到没有更多条目(或更确切地说是 LOC)。
file/stream 的末尾包含用于随机访问(或显示 zip 文件结构)的整个 zip 内容的目录。流式传输数据时,您无法访问流的末尾。所以即使你能寻求,你也不知道去哪里寻求。您必须解压缩才能知道条目的数据何时结束,然后您将获得下一个条目的 LOC,依此类推。
在这个 中说唯一的真实来源是中央目录,所以无论如何我们不能依赖条目的压缩大小来跳过。
我正在尝试以最佳方式读取 zip 中的 ZipEntry 内容。为了实现这一点,我需要标准 ZipInputStream 来使用 InputStream.skip 不需要的条目内容而不是耗尽它。
只要我从ZIP (file format) wiki 上了解到:
Because the files in a ZIP archive are compressed individually it is possible to extract them, or add new ones, without applying compression or decompression to the entire archive. This contrasts with the format of compressed tar files, for which such random-access processing is not easily possible.
由此我假设在使用 ZIP 解压缩条目的内容之前跳过不需要的内容是确定性的。
但是我看到 ZipInputStream(Java 标准)和 ZipArchiveInputStream(apache) 都在排空流,直到下一个条目而不是跳过它,这使我使用它的效率非常低。
我并不完全了解 ZIP 规范,看到两个主要使用的 ZIP API 的这种行为让我觉得这可能是不可能的。
是我的理解不正确,这样的最佳行为是不可能的,还是 Java API 您对有效阅读 Zip 条目有什么建议?
这里的问题是 ZipInputStream
是一个流。您首先读取第一个条目的 LOC(本地文件头),读取条目(解压缩、校验和等),重复直到没有更多条目(或更确切地说是 LOC)。
file/stream 的末尾包含用于随机访问(或显示 zip 文件结构)的整个 zip 内容的目录。流式传输数据时,您无法访问流的末尾。所以即使你能寻求,你也不知道去哪里寻求。您必须解压缩才能知道条目的数据何时结束,然后您将获得下一个条目的 LOC,依此类推。
在这个