是否有任何 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/