查看所选答案的评论,问题出在我的测试数据上,而不是代码。
我正在尝试使用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?为什么它不能正常工作?
答案 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
}