如何从嵌套档案中读取ZipEntry CRC(zip压缩)

时间:2013-10-15 23:35:39

标签: java zip

查看所选答案的评论,问题出在我的测试数据上,而不是代码。

我正在尝试使用ZipEntry对象读取Zip存档的CRC。这适用于直接在文件系统上的拉链。

zStream = new ZipInputStream(new FileInputStream(zipPath))
zEntry = zStream.getNextEntry()
zEntry.getCrc()

我想从嵌套的zipEntry中获取CRC,但我总是返回-1

zStream = new ZipInputStream(new ZipFile(zipPath).getInputStream(zEntry))
zStream.getNextEntry().getCrc()
// always equal -1

有没有办法在不向FS提取嵌套zip的情况下读取CRC?为什么它不能正常工作?

3 个答案:

答案 0 :(得分:1)

  

zStream = new ZipInputStream(new ZipFile(zipPath).getInputStream(zEntry))

那不行。试试这个:

ZipInputStream innerZip = new ZipInputStream(zStream);

在你到达(外部)ZEntry之后,然后迭代innerZip自己的ZEntries并获得他们的CRC等,无论你想要什么。

答案 1 :(得分:0)

如果一个接一个地读取一个条目,则java.util.zip.ZipInputStream的实现不会传递当前条目的CRC。只有在再次调用getNextEntry()之后才可用(对于上一个条目)!

AFAIK没有记录,但迫切需要。

答案 2 :(得分:-1)

这似乎是ZipEntry接口的错误/限制。应该有一个API来计算CRC。

这是一些生成缺失CRC的Groovy代码:

long calculateCRC( zStream) {
    def crc32 = new CRC32()
    crc32.update( IOUtils.toByteArray(zStream))
    return crc32.value
}