2010-07-26 118 views
7

我需要讀取/解包給定FileChannel的.gz文件。從FileChannel讀取GZIP文件(Java NIO)

我玩過使用GZIPInputStream提取GZIP壓縮文件,但是這不會佔用FileChannel。我無法訪問FileChannel從中取得的原始FileInputStream。

如果有人能告訴我一個很好的方法(或至少任何方式)從FileChannel讀取GZIP,我將不勝感激。

改編自 Sun Oracle forums上的一個問題。

回答

19

你可以得到周圍FileChannel包裹的InputStream:

FileChannel fc = ... 
GZIPInputStream gis = new GZIPInputStream(Channels.newInputStream(fc)); 

Channels是在Java SE。

5

是的,有一個解決方案。實現GZip非常簡單。你需要一個Inflater和CRC32,再加上閱讀標題/預告片。不幸的是java.util.zip.Inflater只需要byte[]這是不理想的(直接緩衝區會更有效率)。然而,使用非直接緩衝區和ByteBuffer.array()是一個選項。

建在java.util.zip.CRC32是很慢,reimplementing it in java是一個很好的表現步驟。 com.jcraft.jzliboffers pure java implementation(幾乎看起來像純粹的C,雖然),並有可能取代byte [] w/direct Buffer。與inflater(decomppress)相比,該庫由於邊界檢查過多而無法執行如此深的內聯,所以速度稍慢。但是,壓縮速度更快。