2010-07-26 14 views
7

J'ai besoin de lire/décompresser un fichier .gz avec un FileChannel.Lecture d'un fichier GZIP à partir d'un FileChannel (Java NIO)

J'ai joué avec l'extraction d'archives GZIP en utilisant GZIPInputStream, mais cela ne prendra pas de FileChannel. Je n'ai pas accès au fichier FileInputStream d'origine provenant de FileChannel.

Si quelqu'un pouvait me dire un bon moyen (ou au moins toute façon) de lire GZIP à partir d'un FileChannel, j'apprécierais grandement.

Adapté d'une question sur le Sun Oracle forums.

Répondre

19

Vous pouvez obtenir un InputStream d'emballage autour du FileChannel:

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

Channels est en Java SE.

5

Oui, il existe une solution. La mise en œuvre de GZip est assez simple. Vous avez besoin d'un Inflater et d'un CRC32, en plus de lire l'en-tête/la bande-annonce. Malheureusement, java.util.zip.Inflater ne prend que byte[] ce qui est sous-optimal (un tampon direct aurait été plus efficace). Pourtant, l'utilisation de tampon non-direct et ByteBuffer.array() est une option.

Le construit en java.util.zip.CRC32 est assez lent et reimplementing it in java est un pas agréable vers la performance. com.jcraft.jzliboffers pure java implementation (ressemble presque à du C pur), et il est possible de remplacer le byte [] w/direct Buffer. La bibliothèque est un peu plus lente comparée à inflatable (decomppress) en raison d'un trop grand nombre de contrôles de limites et de l'impossibilité d'effectuer des calculs en profondeur. Pourtant, c'est plus rapide en compression.