我需要读取/解包给定FileChannel的.gz文件。从FileChannel读取GZIP文件(Java NIO)
我玩过使用GZIPInputStream提取GZIP压缩文件,但是这不会占用FileChannel。我无法访问FileChannel从中取得的原始FileInputStream。
如果有人能告诉我一个很好的方法(或至少任何方式)从FileChannel读取GZIP,我将不胜感激。
改编自
Sun
Oracle forums上的一个问题。
我需要读取/解包给定FileChannel的.gz文件。从FileChannel读取GZIP文件(Java NIO)
我玩过使用GZIPInputStream提取GZIP压缩文件,但是这不会占用FileChannel。我无法访问FileChannel从中取得的原始FileInputStream。
如果有人能告诉我一个很好的方法(或至少任何方式)从FileChannel读取GZIP,我将不胜感激。
改编自
Sun
Oracle forums上的一个问题。
你可以得到周围FileChannel包裹的InputStream:
FileChannel fc = ...
GZIPInputStream gis = new GZIPInputStream(Channels.newInputStream(fc));
Channels是在Java SE。
是的,有一个解决方案。实现GZip非常简单。你需要一个Inflater和CRC32,再加上阅读标题/预告片。不幸的是java.util.zip.Inflater
只需要byte[]
这是不理想的(直接缓冲区会更有效率)。然而,使用非直接缓冲区和ByteBuffer.array()是一个选项。
建在java.util.zip.CRC32
是很慢,reimplementing it in java是一个很好的表现步骤。 com.jcraft.jzlib
offers pure java implementation(几乎看起来像纯粹的C,虽然),并有可能取代byte [] w/direct Buffer。与inflater(decomppress)相比,该库由于边界检查过多而无法执行如此深的内联,所以速度稍慢。但是,压缩速度更快。