2010-07-26 113 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)相比,该库由于边界检查过多而无法执行如此深的内联,所以速度稍慢。但是,压缩速度更快。