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

Entrée/Sortie Java Discussion :

Besoin d'aide avec une "ZipException"


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 44
    Par défaut Besoin d'aide avec une "ZipException"
    Bonjour,

    Normalement j'aime pouvoir règler mes erreurs seul, mais celle la je n'y arrive pas.

    J'ai créé un code pour compressé des classgen et les autre fichiers dans un .jar
    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
    36
    37
    38
    public void Save(String filename) {
            if (cgs == null || nonClass == null) {
                throw new IllegalStateException("You need to load before save.");
            }
            FileOutputStream stream = null;
            JarOutputStream out = null;
            try {
                byte buffer[] = new byte[10240];
                stream = new FileOutputStream(filename);
                out = new JarOutputStream(stream);
                for(ClassGen cg :cgs){ //cgs = array de classgen
                    String cName = cg.getClassName();
                    cName=cName.replace('.', File.separatorChar)+".class";
                    System.out.println(cName);
                    try{
                    out.putNextEntry(new JarEntry(cName));
                    }catch(ZipException zex){
                        System.err.println("Error: "+cName);
                       zex.printStackTrace();
                    }
                    out.write(cg.getJavaClass().getBytes());
                    out.flush();
                }
                for (JarEntry entry : nonClass.keySet()) { //nonClass = Hashmap<JarEntry, InputStream>
                    out.putNextEntry(entry);
                    InputStream in = nonClass.get(entry);
                    int nRead=0;
                    while((nRead = in.read(buffer, 0, buffer.length))>0){
                        out.write(buffer, 0, nRead);
                    }
                    in.close();
                }
                out.close(); //line 138
                    stream.close();
            } catch (IOException ex) {
                 ex.printStackTrace();
            } 
        }
    Et sa me donne sa comme erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    java.util.zip.ZipException: invalid entry compressed size (expected 36656 but got 36520 bytes)
            at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:206)
            at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:301)
            at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:146)
            at java.util.zip.ZipOutputStream.close(ZipOutputStream.java:321)
            at gabuuzz.jar.JarHandle.Save(JarHandle.java:138)
            at gabuuzz.Main.main(Main.java:32)
    Quelqun aurait une idée?

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 133
    Par défaut
    Sur le JarOutputStream, une fois que tu ajoutes une entrée (JarEntry), essaie de la fermer avec #closeEntry().
    Cela pourrait expliquer pourquoi il manque des bytes dans ton entrée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
           for (JarEntry entry : nonClass.keySet()) { //nonClass = Hashmap<JarEntry, InputStream>
                    out.putNextEntry(entry);
                    InputStream in = nonClass.get(entry);
                    int nRead=0;
                    while((nRead = in.read(buffer, 0, buffer.length))>0){
                        out.write(buffer, 0, nRead);
                    }
                    out.closeEntry();
                    in.close();
                }

  3. #3
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 44
    Par défaut
    Maintenant sa met l'erreur sur CloseEntry()...

    Peut-être c'est mon code pour loader qui ne fonctionne pas...
    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
    public boolean Load() {
            cgs = new ArrayList<ClassGen>();
            nonClass = new HashMap<JarEntry, InputStream>();
            try {
                Enumeration<JarEntry> entrys = jar.entries();
                while (entrys.hasMoreElements()) {
                    JarEntry entry = entrys.nextElement();
                    if (entry.isDirectory()) {
                        continue;
                    }
                    InputStream in = jar.getInputStream(entry);
                    if (entry.getName().endsWith(".class")) {
                        JavaClass jc = new ClassParser(in, jar.getName()).parse();
                        ClassGen cg = new ClassGen(jc);
                        cgs.add(cg);
                        in.close();
                    } else {
                        nonClass.put(entry, in);
                    }
                }
                //jar.close();
                return true;
            } catch (IOException ex) {
                ex.printStackTrace();
                System.err.println("Can't load the jar file.");
                return false;
            }
        }

  4. #4
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 133
    Par défaut
    Je t'envoie une méthode qui me sert pour l'écriture dans les Jar.

    Suffit de passer un JarOutputStream que tu rempliras au fur et à mesure d'entrée, en pensant à le fermer une fois que toutes tes entrées sont ajoutées.

    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
     
    /**
     * Writes content provided from a reader into a file contained in a jar.
     * 
     * @param output the output stream to write on
     * @param entryName the name of the file that will contain reader data
     * @param contentReader 
     * 
     * @return the zip entry that has been created into the jar
     */
     
    ZipEntry writeEntry(JarOutputStream output, String entryName, ByteArrayInputStream input) {
            if (output == null || entryName == null || entryName.trim().length() == 0 || input == null) {
                    throw new NullPointerException("Null argument passed");
            }
     
            ZipEntry entry = new ZipEntry(entryName);
            byte[] buffer = new byte[BUFFER_LENGTH];
     
            try {
                    output.putNextEntry(entry);
                    int nRead;
     
                    while ((nRead = input.read(buffer, 0, BUFFER_LENGTH)) > 0) {
                            output.write(buffer, 0, nRead);
                    }
     
                    output.closeEntry();
            } catch (IOException e) {
                    e.printStackTrace();
            }
     
            return entry;
    }
    Edit : Si l'erreur surgit sur #Save, #Loader n'est pas en jeu. Peut-être pourrais tu renvoyer l'erreur renvoyé par #closeEntry() ?

  5. #5
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 133
    Par défaut
    Tiens, pense à fermer aussi la première entrée que tu écris en premier. Ca ne résoudra peut-être pas le problème pour autant.

    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
        for(ClassGen cg :cgs){ //cgs = array de classgen
                    String cName = cg.getClassName();
                    cName=cName.replace('.', File.separatorChar)+".class";
                    System.out.println(cName);
                    try{
                    out.putNextEntry(new JarEntry(cName));
                    }catch(ZipException zex){
                        System.err.println("Error: "+cName);
                       zex.printStackTrace();
                    }
                    out.write(cg.getJavaClass().getBytes());
                    out.flush();
                    out.closeEntry();
                }
    J'essaierais de repasser dans la soirée. Bonne chance.

  6. #6
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 44
    Par défaut
    Citation Envoyé par ipingu Voir le message
    Tiens, pense à fermer aussi la première entrée que tu écris en premier. Ca ne résoudra peut-être pas le problème pour autant.

    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
        for(ClassGen cg :cgs){ //cgs = array de classgen
                    String cName = cg.getClassName();
                    cName=cName.replace('.', File.separatorChar)+".class";
                    System.out.println(cName);
                    try{
                    out.putNextEntry(new JarEntry(cName));
                    }catch(ZipException zex){
                        System.err.println("Error: "+cName);
                       zex.printStackTrace();
                    }
                    out.write(cg.getJavaClass().getBytes());
                    out.flush();
                    out.closeEntry();
                }
    J'essaierais de repasser dans la soirée. Bonne chance.
    Oui je l'ai fait après avoir poster le premier message.

    Merci de ton aide. J'essai avec ton code.

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

Discussions similaires

  1. Besoin d'aide avec une méthode simple.
    Par Rusty2096 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 20/05/2009, 22h10
  2. Besoin d'aide avec une requete pour récupérer des hyperliens
    Par scaleo dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 21/12/2007, 12h56
  3. Besoin d'aide avec une syntaxe
    Par jvv 64 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/03/2007, 11h33
  4. Besoin d'aide avec une loto
    Par Slowsher dans le forum C++
    Réponses: 1
    Dernier message: 29/11/2005, 17h49

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