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

0

エントリを次々と読み取る場合、java.util.zip.ZipInputStream の実装は現在のエントリの CRC を配信しません。getNextEntry() を再度呼び出した後にのみ、(前のエントリに対して) 使用可能になります!

私の知る限り、これは文書化されていませんが、緊急に必要です。

于 2015-12-01T13:14:03.163 に答える
-1

これは、実際には ZipEntry インターフェイスのバグ/制限のようです。CRC を計算するための API が必要です。

不足している CRC を生成するための Groovy コードを次に示します。

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