2009-10-01 9 views
3

J'ai un fichier zip qui peut contenir un nombre illimité de fichiers zip (récursivement aussi). J'ai besoin de répéter sur chacun d'eux.ZipFile dans un ZipFile

En ce moment, j'ai une fonction qui prend zipInputStream et zipFile comme paramètres. Le problème est; si je reçois un zip dans un autre zip, j'appelle cette fonction de manière récursive à nouveau. Donc, je ne sais pas comment créer un objet zipFile pour les fichiers zip dans un autre fichier zip. Quelqu'un peut-il suggérer un moyen de le faire? Avez-vous rencontré cela avant.

L'extrait ressemblera à ceci.

private void checkZIP(ZipInputStream zInpStream, ZipFile zf) { 
    try { 
    ZipEntry zipEntry = zInpStream.getNextEntry(); 
    while (zipEntry != null) { 
     String entryName = zipEntry.getName(); 

     if(entryName.endsWith(".zip")) 
      checkZIP(new ZipInputStream(zf.getInputStream(zipEntry)),<NEW ZIPFILE OBJECT FOR THIS ENTRY>); 


     //other files parsing apart from zip. 

     zInpStream.closeEntry(); 
     zipEntry = zInpStream.getNextEntry(); 
    } 
    zInpStream.close(); 
    } catch(Exception ioe) { 
    //catching specific exceptions here. But did not want to put al 
    } 
} 

EDIT: J'ai besoin cet objet fichier zip parce que. Si je rencontre un fichier XML, j'ai besoin de créer un objet Document. Donc, si je passe la méthode normale zipInputStream pour parse() dans DocumentBuilder, il ferme le flux et je ne suis pas en mesure de l'utiliser à nouveau. Donc, j'ai utilisé (ZipFile object).getInputStream(currentEntryForXML) à l'intérieur DocumentBuilder parse().

+2

étendons '' FilterInputStream' pour remplacer la méthode close' comme no-op, et envelopper la 'ZipInputStream' avec un d'eux. – erickson

+3

Méfiez-vous - il est possible (et a été fait) de créer un zipfile récursif: http://www.steike.com/code/useless/zip-file-quine/ –

+0

ouais, je vais faire attention .. merci beaucoup – vpram86

Répondre

4

Vous ne pouvez pas créer un ZipFile pour le fichier zip dans l'archive. Mais pourquoi avez-vous besoin de cet argument dans votre méthode? Si votre seul besoin d'un flux, il suffit d'utiliser votre argument de zInpStream comme paramètre contstructor, comme

checkZIP(new ZipInputStream(zInpStream)); 

Après appel à zInpStream.getNextEntry() zInpStream est déjà positionné au début de cette entrée et ne lira que cette entrée jusqu'à getNextEntry() sera appelé.

Modifier. Vu votre modification. Semble, si vous empêchez la fermeture du cours d'eau, cela vous suffira. Utilisez simplement FilterInputStream légèrement modifié, qui délègue close() à closeEntry() dans zipInputStream, pas un close.

public class ZipGuard extends java.io.FilterInputStream { 
    public ZipGuard(ZipInputStream is) { 
     super(is); 
    } 

    @Override 
    public void close() throws IOException { 
     ((ZipInputStream) in).closeEntry(); 
    } 
} 

Et créer cette garde checkZip:

checkZip(new ZipInputStream(new ZipGuard(zInpStream))); 
+0

S'il vous plaît vérifier ma modification. J'utilise le même flux pour analyser le XML, si j'en ai un dans le zip. Et il ferme le flux. – vpram86

+0

Ça a marché !! :) Merci beaucoup!! :) – vpram86

Questions connexes