0

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

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

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

有没有办法在不将嵌套 zip 提取到 FS 的情况下读取 CRC?为什么它不能按原样工作?

4

3 回答 3

1

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

那是行不通的。尝试这个:

ZipInputStream innerZip = new ZipInputStream(zStream);

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

于 2013-10-15T23:39:13.300 回答
0

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

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

于 2015-12-01T13:14:03.163 回答
-1

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

下面是一些用于生成缺失 CRC 的 Groovy 代码:

long calculateCRC( zStream) {
    def crc32 = new CRC32()
    crc32.update( IOUtils.toByteArray(zStream))
    return crc32.value
}
于 2013-10-16T02:51:59.667 回答