在Java中没有I / O的情况下纠正ZIP实现

时间:2012-10-02 23:58:22

标签: java zip

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

如果需要,请参阅ZIP specification了解此类字段的定义。

从中央目录末尾读取的原因是能够正确解压缩文件,例如自解压文件(例如,请参阅Winzip Self Extractor),其中包含数据实际的ZIP内容可能包含与ZIP标头的现有签名相等的字节序列。

通过“不做I / O”我的意思是ZIP内容以字节数组的形式存在,并且不应使用磁盘或网络访问来解压缩它。

2 个答案:

答案 0 :(得分:2)

您可以使用ByteArrayInputStream读取字节数组,就像它来自文件一样。

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

修改

由于标准ZipFile实现使用本机代码,因此不能与ByteArrayInputStream一起使用。但是,您可能能够调整ZipFile的纯Java实现之一。一个开始的地方是Android implementation。它不能完全完成工作,因为它使用RandomAccessFile。但是,将this thread中的提示用于RandomAccessFile的内存版本,您可以将所需内容拼凑在一起。

答案 1 :(得分:0)

我们的SecureBlackbox包含ZIP components,它使用内存流进行操作。我想这正是你要找的。