java - Java 中无需 I/O 的正确 ZIP 实现

标签 java zip

是否有任何 Java 库可以通过查找中央目录记录的末尾并使用它来定位中央目录记录,然后定位本地文件条目(本地文件头和本地文件数据)来实现读取 ZIP 存档所需的算法,不进行 I/O?

请引用ZIP specification如果需要的话,可以定义这些字段。

从中央目录末尾读取的原因是为了能够正确解压缩文件例如自解压文件(参见Winzip Self Extractor作为示例),这些文件在实际ZIP之前有数据可能包含与 ZIP header 现有签名相同的字节序列的内容。

“不执行 I/O”是指 ZIP 内容作为字节数组存在,并且不应使用磁盘或网络访问来解压缩它。

最佳答案

您可以使用 ByteArrayInputStream像从文件中一样读取字节数组。

byte[] zipData = . . .
ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(zipData));

编辑

由于标准 ZipFile 实现使用 native 代码,因此它不能与 ByteArrayInputStream 一起使用。但是,您也许能够采用 ZipFile 的纯 Java 实现之一。从 Android implementation 开始。它并没有完全完成这项工作,因为它使用了RandomAccessFile。然而,使用 this thread 中的想法对于 RandomAccessFile 的内存版本,您也许能够将所需的一切拼凑在一起。

关于java - Java 中无需 I/O 的正确 ZIP 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12700129/

相关文章:

java - 你能用 Liquibase 初始化 Spring Batch 元数据表吗?

java - 打印数组

windows - 如何创建具有特定编码的 ZIP 文件

php - 在 zip php 中写入 unicode 文件名(linux 服务器)

ant - 将ANT中的zip存档与过滤和区分大小写结合在一起

Python:在 zip 中打开文件而不临时解压缩它

java - 从 SD 卡加载绘图

美国股市的 Java 日历时区

java - 消息太大时 AppEngine 任务队列异常

android - 未找到中央目录条目 (ZipException)