2010-07-26 12 views
7

Ho bisogno di leggere/decomprimere un file .gz dato un FileChannel.Lettura di un file GZIP da un fileChannel (Java NIO)

Ho giocato con l'estrazione di archivi GZIP utilizzando GZIPInputStream, ma questo non richiederà un FileChannel. Non ho accesso al FileInputStream originale dal quale è stato preso il FileChannel.

Se qualcuno potesse dirmi un buon modo (o almeno qualsiasi modo) di leggere GZIP da un FileChannel, lo apprezzerei molto.

Adattato da una domanda sullo Sun Oracle forums.

risposta

19

si potrebbe ottenere un InputStream involucro intorno al FileChannel:

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

Channels è in Java SE.

5

Sì, c'è una soluzione. L'implementazione di GZip è abbastanza semplice. Hai bisogno di un Inflater e CRC32, oltre a leggere l'intestazione/trailer. Purtroppo java.util.zip.Inflater richiede solo byte[] che non è ottimale (un Buffer diretto sarebbe stato più efficiente). Tuttavia, l'utilizzo di buffer non diretto e ByteBuffer.array() è un'opzione.

Il java.util.zip.CRC32 incorporato è piuttosto lento e reimplementing it in java è un bel passo avanti verso le prestazioni. com.jcraft.jzliboffers pure java implementation (sembra quasi puro C, però) ed è possibile sostituire il byte [] w/buffer diretto. La libreria è un po 'più lenta rispetto a inflater (decomppress) a causa di troppi limiti di controllo e incapacità di eseguire così inline in profondità. Eppure, è più veloce con la compressione.