Lesen einer GZIP-Datei von einem FileChannel (Java NIO)

7

Ich muss eine .gz-Datei mit einem FileChannel lesen / entpacken.

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

Wenn jemand mir einen guten Weg (oder zumindest irgendeinen Weg) beim Lesen von GZIP von einem FileChannel erzählen könnte, würde ich es sehr schätzen.

Angepasst an eine Frage in den Sun Oracle-Foren .

    
Franz Joseph Spiegler 26.07.2010, 14:49
quelle

2 Antworten

19

Sie können einen umschließenden InputStream um den FileChannel erhalten:

%Vor%

Kanäle befinden sich in Java SE.

    
Dan LaRocque 26.07.2010 14:58
quelle
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 nimmt java.util.zip.Inflater nur byte[] , was suboptimal ist (ein direkter Puffer wäre effizienter gewesen). Dennoch ist die Verwendung von nicht-direktem Puffer und ByteBuffer.array () eine Option.

Der eingebaute java.util.zip.CRC32 ist ziemlich langsam und wird in Java neu implementiert ein schöner Schritt in Richtung Leistung. com.jcraft.jzlib bietet reine Java-Implementierung (sieht fast wie reines C aus) und es ist möglich, das Byte zu ersetzen [] w / direkter Puffer. 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.

    
bestsss 20.10.2011 20:42
quelle

Tags und Links