IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Lire un fichier zippé contenu dans un autre zip


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Par défaut Lire un fichier zippé contenu dans un autre zip
    Bonjour,
    je souhaiterai analyser un fichier txt qui est contenu dans un zip, lui-même contenu dans un autre fichier zip.

    Alors j'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ZipFile zip = new ZipFile("C:\\Temp\\test.zip");
     
    ZipEntry entry = zip.getEntry("souszip.zip");
     
    InputStream in = zip.getInputStream(entry);
     
    ZipInputStream zis = new ZipInputStream(in);
     
    ZipEntry txtfile = zis.getNextEntry();
     
    if(txtfile!=null)
    {
        InputStream newin = zip.getInputStream(txtfile);
        ZipInputStream newzis = new ZipInputStream(newin);
        BufferedReader br = new BufferedReader(new InputStreamReader(newzis));
     
    //...
    }
    J'ai 2 pb:
    - si le le zip file contenu dans le zip principal est un tgz, txtfile est null (alors que je l'ouvre sans problème avec l'explorateur windows).
    - si ce sont 2 fichiers zips classiques, txtfile est ok, sauf que je ne sais pas comment récupere l'input stream, le getInputStream lance une exception.

    Une idée ?

    MErci !

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Bouben Voir le message
    - si le le zip file contenu dans le zip principal est un tgz, txtfile est null (alors que je l'ouvre sans problème avec l'explorateur windows).
    Sauf erreur le format tgz ne correspond pas à du ZIP, mais à du GZIP... Tu dois donc utiliser GZIPInputStream...

    Citation Envoyé par Bouben Voir le message
    - si ce sont 2 fichiers zips classiques, txtfile est ok, sauf que je ne sais pas comment récupere l'input stream, le getInputStream lance une exception.
    Normal : tu tentes d'ouvrir le flux sur l'objet zip, qui correspond au premier zip, alors que tu tentes de lire un fichier dans le second zip...

    Tu dois utiliser le ZIPInputStream pour cela...

    Un conseil : Évites de multiplier les variables : il n'y a rien de mieux pour s'embrouiller. Au pire, découpe chaque partie en méthode bien séparée.

    Et n'oublies pas les try/finally pour libérer les ressources (ou le try-with-ressource de Java 7) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    ZipFile zip = new ZipFile("C:\\Temp\\test.zip");
    try {
    	ZipInputStream zis = new ZipInputStream(
    		zip.getInputStream(zip.getEntry("souszip.zip")));
    	try {
    		Zipentry entry;
    		while((entry = zis.getNextEntry()) != null) {
     
    			// Lecture sur "zis"
    			...
     
    			// On passe à la suivante :
    			zip.closeEntry();
    		}
    	} finally {
    		zis.close();
    	}
     
    } finally {
    	zip.close();
    }
    a++

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Par défaut
    Merci, ton exemple marche très bien pour lire mon fichier text encapsulé dans 2 zips successifs.

    Par contre, comment fait-on dans le cas ou c'est un .gz qui est encapsulé dans le zip ?
    Car le GZIPInputStream ne propose pas de methode du type GetNextEntry.

    Merci

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    En fait le GZIPInputStream permet le décodage de la partie "gz".
    Un fichier .tgz correspond en fait à un fichier .tar compressé avec GZIP. Il faut donc lire le fichier tar à partir du GZIPInputStream...

    Malheureusement Java ne supporte pas cela en standard. Pour cela tu vas devoir te tourner vers une librairie externe comme Jakarta Commons Compress...


    a++

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Par défaut
    Mercei bcp pour l'aide. En fait il s'agit de gz, donc ça s'est bien passé !

    Au final le code qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    ZipFile zip = new ZipFile("C:\\Temp\\test.zip");
    try
    {
    	ZipInputStream zis = new ZipInputStream(
    	zip.getInputStream(zip.getEntry("souszip.zip")));
    	try
    	{
    		Zipentry entry;
    		while((entry = zis.getNextEntry()) != null)
    		{
     
    			GZIPInputStream gzin = new GZIPInputStream(zf.getInputStream(entry));
    			if(gzin!=null)
    			{
    				BufferedReader buffr = new BufferedReader(new InputStreamReader(gzin));
     
    				//etc...
     
    				gzin.close();
    			}
     
    			// On passe à la suivante :
    			zip.closeEntry();
    		}
    	}
    	finally
    	{
    		zis.close();
    	} 
    }
    finally
    {
        zip.close();
    }
    Merci!
    Benoit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Lire un fichier et écrire dans un autre fichier
    Par Mut dans le forum VBA Access
    Réponses: 4
    Dernier message: 08/04/2013, 16h44
  2. [XL-2007] Créer une liste de validation à partir de données contenues dans un autre fichier
    Par familledacp dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/10/2011, 18h03
  3. Réponses: 1
    Dernier message: 11/08/2011, 08h26
  4. Réponses: 10
    Dernier message: 20/10/2009, 14h35
  5. Inclure le contenu d'un fichier (x)HTML dans un autre
    Par IsmaX dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 03/01/2009, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo