Чтение файла GZIP из FileChannel (Java NIO) - PullRequest
7 голосов
/ 26 июля 2010

Мне нужно прочитать / распаковать файл .gz с указанием FileChannel.

Я поэкспериментировал с извлечением архивов GZIP с использованием GZIPInputStream, но это не займет FileChannel.У меня нет доступа к исходному FileInputStream, из которого был взят FileChannel.

Если кто-то может подсказать мне хороший способ (или хотя бы любой способ) чтения GZIP из FileChannelЯ был бы очень признателен.

Адаптировано из вопроса на форумах Sun Oracle .

Ответы [ 2 ]

19 голосов
/ 26 июля 2010

Вы можете получить упаковку InputStream вокруг FileChannel:

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

Каналы в Java SE.

5 голосов
/ 21 октября 2011

Да, есть решение.Реализация GZip довольно проста.Вам нужен Inflater и CRC32, а также чтение заголовка / трейлера.К сожалению, java.util.zip.Inflater требует только byte[], что является неоптимальным (прямой буфер был бы в разы эффективнее).Тем не менее, использование непрямого буфера и ByteBuffer.array () является опцией.

Встроенный java.util.zip.CRC32 довольно медленный и переопределение его в java - хороший шаг к производительностиcom.jcraft.jzlib предлагает чистую реализацию Java (хотя и выглядит почти как чистый C), и можно заменить byte [] w / direct Buffer.Библиотека несколько медленнее по сравнению с инфлятором (распаковка) из-за слишком большого количества проверок границ и неспособности выполнить так глубоко внутри.Тем не менее, это быстрее при сжатии.

...