2010-07-26 6 views
7

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

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

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

Адаптировано из вопроса на Sun Oracle forums.

ответ

19

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

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

Channels в Java SE.

5

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

Построено в java.util.zip.CRC32 довольно медленно, и reimplementing it in java - это хороший шаг в направлении производительности. com.jcraft.jzliboffers pure java implementation (почти похоже на чистый C, хотя), и можно заменить байт [] w/direct Buffer. Библиотека несколько медленнее по сравнению с раздувом (декомпрессия) из-за слишком большого количества проверок и неспособности выполнить столь глубокий встроенный. Тем не менее, это быстрее при сжатии.