2014-09-09 9 views
5

Ok quindi voglio leggere il contenuto di un file tar.gz (o xy) ma è la stessa cosa. Quello che sto facendo è più o meno questo:Leggi tar.gz in Java con Commons-compression

TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream("c://temp//test.tar.gz"))); 
TarArchiveEntry currentEntry = tarInput.getNextTarEntry(); 
BufferedReader br = null; 
StringBuilder sb = new StringBuilder(); 
while (currentEntry != null) { 
    File f = currentEntry.getFile(); 
    br = new BufferedReader(new FileReader(f)); 
    System.out.println("For File = " + currentEntry.getName()); 
    String line; 
    while ((line = br.readLine()) != null) { 
     System.out.println("line="+line); 
    } 
} 
if (br!=null) { 
    br.close(); 
} 

Ma ottengo nulla quando chiamo il metodo di TarArchiveEntrygetFile.
Sto usando Apache commons comprimere 1.8.1

risposta

10

Non è possibile utilizzare il getFile di TarArchiveEntry. Quel getter è lì solo per l'operazione opposta, quando si comprime i file all'interno di un file tar.

Invece, dovresti leggere direttamente da TarArchiveInputStream. Si prenderà cura di restituirti il ​​contenuto del "file" decomprimendolo al volo.

Per esempio (codice non testato, YMMV):

TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream("c://temp//test.tar.gz"))); 
TarArchiveEntry currentEntry = tarInput.getNextTarEntry(); 
BufferedReader br = null; 
StringBuilder sb = new StringBuilder(); 
while (currentEntry != null) { 
    br = new BufferedReader(new InputStreamReader(tarInput)); // Read directly from tarInput 
    System.out.println("For File = " + currentEntry.getName()); 
    String line; 
    while ((line = br.readLine()) != null) { 
     System.out.println("line="+line); 
    } 
    currentEntry = tarInput.getNextTarEntry(); // You forgot to iterate to the next file 
} 
+0

Questo è così intuitivo ... Anche gli stati Javadoc "ottenere il file di questa voce." – kraxor

+0

@kraxor Questo succede perché un oggetto 'File' può riferirsi solo a file esistenti sul disco, e quindi non può essere usato per i nomi di file di file compressi – Ferrybig