2012-06-18 117 views
3

我試圖使用Inflater對gzip壓縮的數據進行解壓縮。根據文檔,使用Java中的Inflater解壓縮壓縮數據

如果參數'nowrap'爲true,那麼將不會使用ZLIB標頭和校驗和 字段。這提供了與GZIP和PKZIP使用的壓縮格式 的兼容性。

注意:使用'nowrap'選項時,還需要提供 額外的「虛擬」字節作爲輸入。這是ZLIB本地 庫所需的,以支持某些優化。

傳遞true的構造函數,然後試圖在DataFormatException: invalid block type解壓縮的數據結果被拋出。按照this answer中的說明,我在setInput()的參數末尾添加了一個空字節,無濟於事。

我需要用GZIPInputStream代替嗎?我究竟做錯了什麼?

回答

4

Java文檔不正確,或至少誤導:

nowrap - 如果爲true,則支持GZIP兼容的壓縮

什麼NOWRAP的意思是,原始放氣數據將被解壓縮。 gzip流是用gzip頭和尾部包裹的原始縮放數據。要使用此類完全解碼gzip格式,您需要按照RFC 1952中所述處理gzip頭,使用inflater解壓縮原始縮放數據,使用該類計算未壓縮數據的crc32,然後驗證crc和長度(modulo 2^32)在gzip預告片中,同樣在RFC中指定。

+1

順便說一句,他們還拼錯了班級的名字。它應該是「充氣機」。好吧。 –

1

我認爲讀取GZIP流是不夠的,請設置nowrap=true,您還必須使用gzip頭,該頭不是壓縮流的一部分。見例如。 readHeader()in this implementation