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

Langage Java Discussion :

lire un zip dans un zip


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 37
    Points : 29
    Points
    29
    Par défaut lire un zip dans un zip
    Bonjour,

    Je voudrais savoir s'il est possible de lire un fichier texte zippé lequel se trouve dans le JAR. Donc j'ai une structure du type:
    - monAppli.JAR
    - mes différentes classes (au nombre de deux)
    - thesaurus_fr.ocid (qui est le fichier zippé)

    Le fichier zip ne contient qu'un seul fichier qui s'appelle thesaurus_fr.dic (qui est un fichier TXT).

    J'ai essayé :
    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
     
    try {
         URL zipUrl = Synonyms.class.getResource("thesaurus_" + lang + ".ocid");
         if (zipUrl == null) {
              trace("perhaps there is no zipped synonyms file");
              return mot;
         }
         trace("zipUrl=" + zipUrl.toString());
         ZipFile zip = new ZipFile(new File(zipUrl.getFile()));
         ZipEntry entry = zip.getEntry("thesaurus_" + lang + ".dic");
         if (entry == null) {
              trace("no entry for synonyms");
              return mot;
         }
         InputStream input = zip.getInputStream(entry);
         try (BufferedReader br = new BufferedReader(
              new InputStreamReader(input, "UTF-8"))) {
              String line = br.readLine();
              while (line != null) {
                   if (!line.startsWith("#")) {
                        mot = getWord(line, word);
                        if (mot != null) {
                             return mot;
                        }
                   }
                   line = br.readLine();
              }
              br.close();     
         }
    } catch (IOException ex) {
         err("Exception", ex);
    }
    Ça ne fonctionne que si je reste dans mon EDI (Netbeans). Si je copie le JAR ailleurs ça ne marche plus. Pourtant, le JAR contient bien le fichier zippé.

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 326
    Points : 439
    Points
    439
    Par défaut
    Ça ne fonctionne que si je reste dans mon EDI (Netbeans). Si je copie le JAR ailleurs ça ne marche plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZipFile zip = new ZipFile(new File(zipUrl.getFile()));
    Je dirais que c'est "normal". Lorsque vous testez via l'IDE, vous n'utilisez pas le JAR mais le système de fichier. Vous pouvez-donc créer un File depuis l'URL. Mais, lorsque vous testez le programme "packagé", il n'y à plus de fichier correspondant. Lorsqu'une "ressource" est dans un Jar, la seule façon de la lire et d'utiliser le stream produit par Class+getResourceAsStream.

    Une solution serait de copier votre fichier en dehors du Jar et d'ensuite le lire.
    Une autre solution serait de lire le Zip depuis le stream. Il y à bien ZipInputStream mais je ne suis pas sur que ce soit la même chose que ZipFile.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par gervais.b Voir le message
    Il y à bien ZipInputStream mais je ne suis pas sur que ce soit la même chose que ZipFile.
    Une différence notable est qu'avec ZipInputStream on n'a pas la capacité RandomAccess et donc pas accès au registre des ZipEntry pour en demander une en particulier.

    Tout ce qu'on peut faire c'est boucler sur les entrées en les lisant les unes après les autres, jusqu'à trouver celle qu'on veut (typiquement, qui a le bon nom.)

    Après c'est pas magique : Java part du principe qu'une ressource du classpath n'est pas forcément disponible avec RandomAccess, donc si on veut que quelque chose soit une ressource du classpath, on doit soit se passer de RandomAccess, soit le copier d'abord quelque part pour que ce soit disponible.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Une différence notable est qu'avec ZipInputStream on n'a pas la capacité RandomAccess et donc pas accès au registre des ZipEntry pour en demander une en particulier.

    Tout ce qu'on peut faire c'est boucler sur les entrées en les lisant les unes après les autres, jusqu'à trouver celle qu'on veut (typiquement, qui a le bon nom.)

    Après c'est pas magique : Java part du principe qu'une ressource du classpath n'est pas forcément disponible avec RandomAccess, donc si on veut que quelque chose soit une ressource du classpath, on doit soit se passer de RandomAccess, soit le copier d'abord quelque part pour que ce soit disponible.
    ZipInputStream était bien la bonne piste, d'autant que je n'avais pas besoin d'un RandomAccess.

    Merci

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

Discussions similaires

  1. Ecrire & Lire des énumérés dans un fichier Texte
    Par WebPac dans le forum Langage
    Réponses: 8
    Dernier message: 18/06/2008, 10h04
  2. [java.util.Zip] Lire un zip dans un zip
    Par charpent1 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/06/2008, 12h39
  3. Réponses: 4
    Dernier message: 29/04/2004, 15h29
  4. Lire une valeur dans le registre
    Par John.s dans le forum C
    Réponses: 2
    Dernier message: 26/11/2003, 19h55
  5. Lire un attribut dans un fichier XML en C++
    Par ti.k-nar dans le forum XML
    Réponses: 2
    Dernier message: 14/10/2002, 15h22

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