从FileChannel(Java NIO)读取GZIP文件

Fra*_*ler 7 java zip gzip nio filechannel

我需要在给定FileChannel的情况下读取/解压缩.gz文件.

我已经玩过使用GZIPInputStream提取GZIP档案,但这不会占用FileChannel.我无权访问FileChannel的原始FileInputStream.

如果有人能告诉我一个从FileChannel阅读GZIP 的好方法(或者至少是任何方式),我将非常感激.

改编自Sun Oracle论坛上的问题.

Dan*_*que 19

您可以在FileChannel周围获取包装InputStream:

FileChannel fc = ...
GZIPInputStream gis = new GZIPInputStream(Channels.newInputStream(fc));
Run Code Online (Sandbox Code Playgroud)

渠道在Java SE中.


bes*_*sss 5

是的,有一个解决方案.实现GZip非常简单.你需要一个Inflater和CRC32,再加上阅读标题/预告片.不幸的是java.util.zip.Inflater,只采用byte[]哪种不是最理想的(直接缓冲区的效率会更高).然而,使用非直接缓冲区和ByteBuffer.array()是一种选择.

内置的java.util.zip.CRC32速度很慢,在java中重新实现它是迈向性能的一个很好的一步. com.jcraft.jzlib 提供纯Java实现(几乎看起来像纯C),并且可以替换byte [] w/direct Buffer.由于边界检查太多而无法执行如此深的内联,因此与inflater(decomppress)相比,库有点慢.然而,压缩速度更快.