9

我需要读取/解压给定 FileChannel 的 .gz 文件。

我已经尝试过使用 GZIPInputStream 提取 GZIP 档案,但这不会占用 FileChannel。我无权访问从中获取 FileChannel 的原始 FileInputStream。

如果有人能告诉我从 FileChannel 读取 GZIP 的好方法(或至少任何方法),我将不胜感激。

改编自Sun Oracle 论坛上的一个问题。

4

2 回答 2

20

您可以获得围绕 FileChannel 的包装 InputStream:

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

频道在 Java SE 中。

于 2010-07-26T14:58:15.017 回答
7

是的,有一个解决方案。实现 GZip 相当简单。您需要一个 Inflater 和 CRC32,以及阅读标题/预告片。不幸的是java.util.zip.Inflater,只需要byte[]次优的(直接 Buffer 效率会高几倍)。然而,使用非直接缓冲区和 ByteBuffer.array() 是一种选择。

内置java.util.zip.CRC32非常慢,在 java 中重新实现它是朝着性能迈出的一大步。 com.jcraft.jzlib 提供纯 java 实现(虽然几乎看起来像纯 C),并且可以用直接 Buffer 替换 byte[]。由于边界检查过多且无法执行如此深入的内联,因此与 inflater(解压缩)相比,该库要慢一些。然而,它的压缩速度更快。

于 2011-10-20T20:42:56.540 回答