我需要读取/解压给定 FileChannel 的 .gz 文件。
我已经尝试过使用 GZIPInputStream 提取 GZIP 档案,但这不会占用 FileChannel。我无权访问从中获取 FileChannel 的原始 FileInputStream。
如果有人能告诉我从 FileChannel 读取 GZIP 的好方法(或至少任何方法),我将不胜感激。
改编自Sun Oracle 论坛上的一个问题。
我需要读取/解压给定 FileChannel 的 .gz 文件。
我已经尝试过使用 GZIPInputStream 提取 GZIP 档案,但这不会占用 FileChannel。我无权访问从中获取 FileChannel 的原始 FileInputStream。
如果有人能告诉我从 FileChannel 读取 GZIP 的好方法(或至少任何方法),我将不胜感激。
改编自Sun Oracle 论坛上的一个问题。
您可以获得围绕 FileChannel 的包装 InputStream:
FileChannel fc = ...
GZIPInputStream gis = new GZIPInputStream(Channels.newInputStream(fc));
频道在 Java SE 中。
是的,有一个解决方案。实现 GZip 相当简单。您需要一个 Inflater 和 CRC32,以及阅读标题/预告片。不幸的是java.util.zip.Inflater
,只需要byte[]
次优的(直接 Buffer 效率会高几倍)。然而,使用非直接缓冲区和 ByteBuffer.array() 是一种选择。
内置java.util.zip.CRC32
非常慢,在 java 中重新实现它是朝着性能迈出的一大步。 com.jcraft.jzlib
提供纯 java 实现(虽然几乎看起来像纯 C),并且可以用直接 Buffer 替换 byte[]。由于边界检查过多且无法执行如此深入的内联,因此与 inflater(解压缩)相比,该库要慢一些。然而,它的压缩速度更快。