2013-10-15 31 views
0

查看所選答案的註釋,問題出在我的測試數據而不是代碼上。如何從嵌套存檔中讀取ZipEntry CRC(zip中的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 

有沒有辦法讀取CRC而不提取嵌套壓縮到FS?爲什麼不按原樣工作?

+0

你在第二個例子中使用了哪個'zEntry'? –

+0

@SotiriosDelimanolis嵌套zip的zEntry – cmcginty

+0

也許我今天很慢,但是我想看看你試圖從中提取的zip結構以及你正在嘗試讀取的CRC。 –

回答

1

的zstream =新ZipInputStream(新的ZipFile(zipPath).getInputStream(zEntry是))

這是行不通的。試試這個:

ZipInputStream innerZip = new ZipInputStream(zStream); 

你要關注的(外)ZEntry後,再重複innerZip自己ZEntries,並得到他們的CRC等,任何你想要的。

+0

嵌套的CRC仍然返回-1,加上關閉內層流也會影響外層流。 – cmcginty

+0

那麼不要關閉它。也許在嵌套條目上沒有CRC? – EJP

+0

我得出了同樣的結論。我查看了嵌套條目(一個簽名的jar),看起來jarsigner正在從存檔中剝離CRC。 – cmcginty

-1

這看起來確實是ZipEntry接口的缺陷/限制。應該有一個API來計算CRC。

下面是一些Groovy代碼來生成缺少CRC:

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

爲什麼?這是毫無意義的,除非在zip文件中有一個CRC來比較它。不是一個錯誤。不是限制。 – EJP

+0

所以你同意ZipEntry CRC不是有用的,除非你手動生成CRC。我仍然認爲Java Zip API應該提供這個功能,而不是強迫所有人滾動自己的CRC校驗。 – cmcginty

0

如果讀了一個又一個的條目,java.util.zip.ZipInputStream中的實現不提供當前條目的CRC。只有在再次調用getNextEntry()之後,它纔可用(對於之前的條目)!

AFAIK這沒有記錄,但迫切需要。