2014-09-09 4 views
5

Ok, donc je veux lire le contenu d'un fichier tar.gz (ou un xy) mais c'est la même chose. Ce que je fais est plus ou moins ceci:Lire tar.gz en Java avec 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(); 
} 

Mais je reçois nulle quand j'appelle la méthode getFile de TarArchiveEntry.
J'utilise Apache commons compress 1.8.1

Répondre

10

Vous ne pouvez pas utiliser le getFile de TarArchiveEntry. Ce getter n'est là que pour l'opération inverse, lorsque vous compressez des fichiers dans un fichier tar. Au lieu de cela, vous devriez lire directement à partir de TarArchiveInputStream. Il prendra soin de vous renvoyer le contenu du "fichier" en le décompressant à la volée.

Par exemple (code non testé, 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

Il en est ainsi contre-intuitif ... Même les Etats javadoc "Obtenez le fichier de cette entrée." – kraxor

+0

@kraxor Cela se produit car un objet 'File' ne peut faire référence qu'aux fichiers existants sur le disque et ne peut donc pas être utilisé pour les noms de fichiers compressés – Ferrybig