【问题标题】:Reading a GZIP file from a FileChannel (Java NIO)从 FileChannel 读取 GZIP 文件 (Java NIO)
【发布时间】:2011-03-21 03:24:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java zip gzip nio filechannel


    【解决方案1】:

    您可以在 FileChannel 周围获得一个包装 InputStream:

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

    Channels 在 Java SE 中。

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2013-03-14
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多