2009-05-23 20 views
6

Ho 100 file .gz che ho bisogno di decomprimere. Ho un paio di domandedecomprimere il file .gz nel lotto

a) Sto usando il codice fornito a http://www.roseindia.net/java/beginners/JavaUncompress.shtml per decomprimere il file .gz. Funziona bene. Quest: - c'è un modo per ottenere il nome del file zippato. So che la classe Zip di Java fornisce l'enumerazione del file entery su cui lavorare. Questo può darmi il nome del file, la dimensione ecc. Archiviati nel file .zip. Ma abbiamo lo stesso per i file .gz o il nome del file è lo stesso di filename.gz con .gz rimosso.

b) c'è un altro modo elegante per decomprimere il file .gz chiamando la funzione di utilità nel codice java. Come chiamare l'applicazione 7-zip dalla tua classe java. Quindi, non devo preoccuparmi del flusso di input/output.

Grazie in anticipo. Kapil

risposta

9

a) Zip è un formato di archivio, mentre gzip non è.Quindi un iteratore di entrata non ha molto senso a meno che (per esempio) i file gz non siano compressi. Quello che vuoi è probabilmente:

File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", "")); 

b) Si desidera solo decomprimere i file? In caso contrario, potrebbe essere opportuno utilizzare GZIPInputStream e leggere direttamente i file, ad esempio senza decompressione intermedia.

Ma ok. Diciamo che davvero solo vuoi decomprimere i file. Se è così, si potrebbe forse usare questo:

public static File unGzip(File infile, boolean deleteGzipfileOnSuccess) throws IOException { 
    GZIPInputStream gin = new GZIPInputStream(new FileInputStream(infile)); 
    FileOutputStream fos = null; 
    try { 
     File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", "")); 
     fos = new FileOutputStream(outFile); 
     byte[] buf = new byte[100000]; 
     int len; 
     while ((len = gin.read(buf)) > 0) { 
      fos.write(buf, 0, len); 
     } 

     fos.close(); 
     if (deleteGzipfileOnSuccess) { 
      infile.delete(); 
     } 
     return outFile; 
    } finally { 
     if (gin != null) { 
      gin.close();  
     } 
     if (fos != null) { 
      fos.close();  
     } 
    }  
} 
+0

Ciao, posso leggere i file senza uncomprerssing. Voglio qualcosa come leggerlo riga per riga. E, i file potrebbero non avere solo 80 caratteri in lunghezza/linea. BufferedReader è quello che funzionava per me. Ma non ha un costruttore per GzInputStream. –

+0

Scriverò quello che voglio, ad esempio: BufferedReader in = new BufferedReader (new GzipFileReader (file)); Quindi implementare GzipFileReader come estende Reader. – fredarin

2

Per quanto riguarda A, il comando gunzip crea un file non compresso con il nome originale meno il suffisso .gz. Vedi lo man page.

Per quanto riguarda B, avete bisogno di gunzip in particolare, o lo farò un altro algoritmo di compressione? C'è uno java port dell'algoritmo di compressione LZMA usato da 7zip per creare i file .7z, ma non gestirà i file .gz.

0

Se si ha un numero fisso di file da decomprimere una volta, perché non si usano strumenti esistenti per questo? Come ha notato Paul Morie, gunzip possono farlo: for i in *.gz; do gunzip $i; done e sarebbe automaticamente assegnare loro un nome, strippaggio .gz$

Su Windows, provare WinRAR, probabilmente, o gunzip da http://unxutils.sf.net

0

GZip viene normalmente utilizzata solo su singolo file, quindi in genere non contiene informazioni sui singoli file. Per raggruppare più file in un archivio compresso, vengono prima combinati in un file Tar non compresso (con informazioni sui singoli contenuti) e quindi compressi come un singolo file. Questa combinazione è chiamata Tarball.

Esistono librerie per estrarre le informazioni sui singoli file da un Tar, proprio come con ZipEntries. One example. Dovrai prima estrarre il file .gz in un file temporaneo per poterlo utilizzare, o quantomeno alimentare il GZipInputStream nella libreria Tar.

È anche possibile chiamare 7-Zip dalla riga di comando utilizzando Java. La sintassi della riga di comando 7-Zip è qui: 7-Zip Command Line Syntax. Esempio di chiamata alla shell dei comandi da Java: Executing shell commands in Java. Dovrai chiamare 7-Zip due volte: una volta per estrarre il Tar dal file .tar.gz o .tgz, e di nuovo su estrai i singoli file dal Tar.

Oppure, puoi semplicemente fare la cosa facile e scrivere un breve script di shell o un file batch per eseguire la decompressione. Non c'è motivo di martellare un piolo quadrato in un buco rotondo: questo è ciò per cui sono fatti i file batch. Come bonus, puoi anche alimentare i parametri, riducendo considerevolmente la complessità dell'esecuzione di una riga di comando java, lasciando comunque l'esecuzione del controllo java.

0

Hai provato

gunzip *.gz 
0

file .gz (compressi con gzip) in grado di memorizzare il nome del file di un file compresso. Così, ad esempio, FuBar.doc può essere salvato all'interno di myDocument.gz e con la necessaria compressione, il file può essere ripristinato nel nome del file FuBar.doc. Sfortunatamente, java.util.zip.GZIPInputStream non supporta alcun modo di leggere il nome del file anche se è archiviato all'interno dell'archivio.

Problemi correlati