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 の実装は非常に簡単です。インフレータと CRC32 に加えて、ヘッダー/トレーラーの読み取りが必要です。残念ながら、最適ではないものjava.util.zip.Inflaterだけbyte[]を使用します (直接バッファーを使用すると、何倍も効率的になります)。ただし、非直接バッファと ByteBuffer.array() を使用することはオプションです。

ビルトインjava.util.zip.CRC32は非常に遅く、Java で再実装することは、パフォーマンスへの良い一歩です。 com.jcraft.jzlib 純粋な Java 実装を提供し(ほとんど純粋な C のように見えます)、バイト [] を直接バッファーに置き換えることができます。ライブラリは、境界チェックが多すぎてインラインで実行できないため、インフレータ (圧縮解除) に比べてやや遅くなります。それでも、圧縮すると高速になります。

于 2011-10-20T20:42:56.540 に答える