2010-07-26 7 views
7

Ich muss eine .gz-Datei mit einem FileChannel lesen/entpacken.Lesen einer GZIP-Datei von einem FileChannel (Java NIO)

Ich habe mit dem Extrahieren von GZIP-Archiven mit GZIPInputStream herumgespielt, aber das dauert keinen FileChannel. Ich habe keinen Zugriff auf den ursprünglichen FileInputStream, von dem der FileChannel stammt.

Wenn jemand mir einen guten Weg (oder mindestens irgendein Weg) des Lesens von GZIP von einem FileChannel erzählen könnte, würde ich es sehr schätzen.

Angepasst von einer Frage auf der Sun Oracle forums.

Antwort

19

Sie könnten eine Verpackung Input um den Filechannel erhalten:

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

Channels in Java SE ist.

5

Ja, es gibt eine Lösung. Die Implementierung von GZip ist ziemlich einfach. Sie benötigen einen Inflater und CRC32 sowie den Header/Trailer. Leider java.util.zip.Inflater dauert nur byte[] was suboptimal ist (ein direkter Puffer wäre mal effizienter gewesen). Die Verwendung von nicht-direktem Puffer und ByteBuffer.array() ist jedoch eine Option. Die eingebaute java.util.zip.CRC32 ist ziemlich langsam und reimplementing it in java ist ein schöner Schritt in Richtung Leistung. com.jcraft.jzliboffers pure java implementation (sieht fast wie reines C aus) und es ist möglich, das Byte [] w/direct Buffer zu ersetzen. Die Library ist etwas langsamer im Vergleich zu inflater (decompress), weil zu viele Grenzen überprüft werden und es nicht möglich ist, so tief inline zu arbeiten. Es ist jedoch schneller bei der Komprimierung.

Verwandte Themen