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 :

Extraire fichiers d un jar


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Extraire fichiers d un jar
    Bonjour,

    je voulais une methode me permettant d extraire les fichiers d un jar.
    Voici la methode que j ai faite:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    import java.io.File;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.net.URL;
    import java.util.jar.*;
    import java.util.Enumeration;
     
    public class Test {
     
        public static void main(String[] args) {
     
            JarFile jarFile = null;
            try {
                jarFile = new JarFile("C:\\Folder1\\data.jar");
                String jarName = jarFile.getName();
                String jarFolder = jarName.substring(0, jarName
                        .lastIndexOf(File.separator));
                System.out.println("jarName = " + jarName);
                System.out.println("jarFolder = " + jarFolder);
     
                // get the list of the jar file entries
                Enumeration enumeration = jarFile.entries();
                int i=0;
                while (enumeration.hasMoreElements()) {
     
                    String elementName = enumeration.nextElement().toString();
     
                    // while the current is a directory, create the directory and go to the next element
                    while (jarFile.getEntry(elementName).isDirectory()) {
     
                        new File(jarFolder + File.separator + elementName).mkdirs();
                        elementName = enumeration.nextElement().toString();
                    }
     
                    URL myURL = new URL("jar:file:/" + jarName + "!/" + elementName);
                    BufferedInputStream input = new BufferedInputStream(myURL
                            .openStream());
                    i++;
                    System.out.println("Extracted Element n " +i + " = "+ jarFolder + File.separator + elementName);
                    BufferedOutputStream output = new BufferedOutputStream(
                            new FileOutputStream(jarFolder + File.separator
                                    + elementName));
     
                    int c;
                    while ((c = input.read()) != -1) {
                        output.write(c);
                    }
                    input.close();
                    output.close();
     
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    Elle semble marcher.
    Mais je pense qu il doit il y avoir d autres facons bien meilleures, donc si qqn a des suggestions ou modifications, n hesitez pas.

    Et si cette petite fonction peut aider un debutant Java, c est tout aussi bien

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Arg finalement il y a un probleme.
    En plein milieu de l extraction ca plante
    java.io.FileNotFoundException...

    En l erreur semble venir du jar lui meme?
    lorsque je cree le jar :

    Si je rentre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jar cf test.jar *.class image Properties
    ca marche

    mais si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jar cf test.jar *.class image Properties\*.properties
    et bien lorsque je veux l extraire il plante au niveau de l extraction des fichiers properties (il ne voit pas qu il u a un folder qui s appelle properties)

    Help please

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Robert_aime_Java
    Arg finalement il y a un probleme.
    En plein milieu de l extraction ca plante
    java.io.FileNotFoundException...
    C'est ta boucle de création des répertoires qui n'est pas bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    // while the current is a directory, create the directory and go to the next element
                    while (jarFile.getEntry(elementName).isDirectory()) {
     
                        new File(jarFolder + File.separator + elementName).mkdirs();
                        elementName = enumeration.nextElement().toString();
                    }
    Tu ne rentres jamais dedans (sauf si tu as un répertoire vide), car la listes des entrées que tu obtiens contient toutjours le chemin complets vers le fichier et non pas vers les répertoires...


    Il faut donc vérifié pour chaque fichier si le répertoire parent existe (et eventuellement le créer).


    J'ai également d'autre remarques sur ton code :
    • Tu as beaucoup de répétition de code, par exemple pour le nom du fichier : jarFolder + File.separator + elementName. Il serait plus pratique de créer un objet File temporaire...
    • Tu devrais utiliser la méthode getInputStream() de ton JarFile pour lire le fichier depuis le jar au lieu d'utiliser URL. URL est très bien lorsque tu veux lire un seul fichier. Mais dans ton cas cela revient à relire le fichier *.jar à chaque fois...
    • Il faut utiliser des bloc try/finally pour fermer proprement les flux. Et d'ailleurs tu ne fermes pas le JarFile !!
    • Perso je préfères gérer moi-même la bufférisation de la lecture avec un byte[] plutôt que d'utiliser un BufferedInputStream et de faire de la lecture byte à byte... mais ce n'est qu'une opinion personnelle.

    Au final cela pourrait donner quelque chose comme cela :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
        public static void main(String[] args) {
     
            JarFile jarFile = null;
            try {
                jarFile = new JarFile("C:\\Folder1\\data.jar");
                try {
                    String jarName = jarFile.getName();
                    String jarFolder = jarName.substring(0, jarName
                            .lastIndexOf(File.separator));
                    System.out.println("jarName = " + jarName);
                    System.out.println("jarFolder = " + jarFolder);
     
                    // get the list of the jar file entries
                    Enumeration enumeration = jarFile.entries();
                    int i = 0;
                    while (enumeration.hasMoreElements()) {
     
                        String elementName = enumeration.nextElement().toString();
     
                        // Pour chaque élément on récupère l'objet ZipEntry correspondant
                        ZipEntry entry = jarFile.getEntry(elementName);
     
                        // On crée également un File représentant le fichier et son répertoire parent :
                        File file = new File(jarFolder + File.separator + elementName);
                        File parent = file.getParentFile();
                        // Si le répertoire 'parent' n'existe pas :
                        if (!parent.exists()) {
                            // On tente de le créer :
                            if (!parent.mkdirs()) {
                                // Et on renvoit une exception en cas d'échec :
                                throw new IOException("Unable to create directory : " + parent);
                            }
                        }
     
                        i++;
                        System.out.println("Extracted Element n " + i + " = " + file);
     
                        // On récupère l'InputStream du fichier à l'intérieur du ZIP/JAR
                        InputStream input = jarFile.getInputStream(entry);
                        try {
                            // On crée l'OutputStream vers la sortie :
                            OutputStream output = new FileOutputStream(file);
                            try {
                                // On utilise une lecture bufférisé :
                                byte[] buf = new byte[4096];
                                int len;
                                while ( (len=input.read(buf)) > 0 ) {
                                    output.write(buf, 0, len);
                                }
                            } finally {
                                // Fermeture du fichier de sortie
                                output.close();
                            }
                        } finally {
                            // Fermeture de kl'inputStream en entrée
                            input.close();
                        }
                    } // fin while(enumeration)
                } finally {
                    // Fermeture du JarFile
                    jarFile.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    J'ai essayé de commenter le code, et je reste ouvert à toutes remarques/commentaires

    a++

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Encore une fois de plus merci merci et merci
    Je me plonge dans tout ca

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Concernant la reponse, il y a un petit bug je crois.
    Par exemple lorsque le premier element (META-INF/) correspond au repertoire, la methode extrait le repertoire mais en tant que fichier, pas en tant que repertoire.

    Ce qui fait qu au lieu d avoir le repertoire META-INF/
    J ai un fichier sans extension META-INF

    Je m y remets demain matin de tres bonne heure ;-)

    Merci en tout cas

  6. #6
    Membre averti Avatar de supernova
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 447
    Points : 415
    Points
    415
    Par défaut
    Bonjour,

    Moi je ferait ceci
    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
     
    try {
         File fichierJar = new File("c://Windows//temp//test.jar");
         //Ouverture du fichier zip en lecture
        ZipInputStream zis=new ZipInputStream(new FileInputStream(fichierJar));
        //Récupére les entrées éffectivement zipées dans le zip
       ZipEntry ze=zis.getNextEntry();
    									while(ze!=null) {
    	        //Dézipe le fichier pour lecture
    	        System.out.println(ze.toString());
    	        //Passer au suivant
    	       ze=zis.getNextEntry();
    	}
     
                 //Fermer le fichier zip
                 zis.close();
    }
    catch (Exception e) {
    	System.out.println("Exception : " + e.getMessage());
    }

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Robert_aime_Java
    Concernant la reponse, il y a un petit bug je crois.
    Par exemple lorsque le premier element (META-INF/) correspond au repertoire, la methode extrait le repertoire mais en tant que fichier, pas en tant que repertoire.
    En effet il faut vérifier si l'entrée est un répertoire :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    public static void main(String[] args) {
    
            JarFile jarFile = null;
            try {
                jarFile = new JarFile("C:\\Folder1\\data.jar");
                try {
                    String jarName = jarFile.getName();
                    String jarFolder = jarName.substring(0, jarName
                            .lastIndexOf(File.separator));
                    System.out.println("jarName = " + jarName);
                    System.out.println("jarFolder = " + jarFolder);
        
                    // get the list of the jar file entries
                    Enumeration enumeration = jarFile.entries();
                    int i = 0;
                    while (enumeration.hasMoreElements()) {
        
                        String elementName = enumeration.nextElement().toString();
        
                        // Pour chaque élément on récupère l'objet ZipEntry correspondant
                        ZipEntry entry = jarFile.getEntry(elementName);
        
                        // On crée également un File représentant le fichier et son répertoire parent :
                        File file = new File(jarFolder + File.separator + elementName);
                        
                        
                        if (entry.isDirectory()) {
                            // Si le répertoire n'existe pas on le crée :
                            if (!file.exists()) {
                                mkdirs(file);
                            }
                        } else {
                            File parent = file.getParentFile();
                            // Si le répertoire 'parent' n'existe pas on le crée :
                            if (!parent.exists()) {
                                mkdirs(file);
                            }
            
                            i++;
                            System.out.println("Extracted Element n " + i + " = " + file);
                            
                            // On récupère l'InputStream du fichier à l'intérieur du ZIP/JAR
                            InputStream input = jarFile.getInputStream(entry);
                            try {
                                // On crée l'OutputStream vers la sortie :
                                OutputStream output = new FileOutputStream(file);
                                try {
                                    // On utilise une lecture bufférisé :
                                    byte[] buf = new byte[4096];
                                    int len;
                                    while ( (len=input.read(buf)) > 0 ) {
                                        output.write(buf, 0, len);
                                    }
                                } finally {
                                    // Fermeture du fichier de sortie
                                    output.close();
                                }
                            } finally {
                                // Fermeture de kl'inputStream en entrée
                                input.close();
                            }
                        }
                    } // fin while(enumeration)
                } finally {
                    // Fermeture du JarFile
                    jarFile.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    avec la méthode mkdirs() défini de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public static void mkdirs (File file) throws IOException {
            if (!file.mkdirs()) {
                // Et on renvoit une exception en cas d'échec :
                throw new IOException("Unable to create directory : " + file);
            }
        }
    a++

    PS : supernova >> avec ton code tu ne lis que les noms des fichiers et non pas leurs contenu.

  8. #8
    Membre averti Avatar de supernova
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 447
    Points : 415
    Points
    415
    Par défaut
    Oups, c'est vrai

    Ton code est super pro.

  9. #9
    Membre averti Avatar de supernova
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 447
    Points : 415
    Points
    415
    Par défaut
    Euh .. encore une petite amélioration peut être ; si ton jar contient un fichier zip on ne liste pas les fichiers contenus dans l'archive.

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Bonjour adiGuba et supernova,

    Juste une infime modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                        if (entry.isDirectory()) {
                            // Si le répertoire n'existe pas on le crée :
                            if (!file.exists()) {
                                mkdirs(file);
                            }
                        } else {
                            File parent = file.getParentFile();
                            // Si le répertoire 'parent' n'existe pas on le crée :
                            if (!parent.exists()) {
                                mkdirs(parent);
                            }
    et avec ca, et bien ca marche tres bien
    Merci pour vos reponses et vos conseils. Cela m a beaucoup aide et j espere que ca aidera d autres developeurs

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

Discussions similaires

  1. Charger fichier à partir de JAR en static
    Par ®om dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 02/06/2006, 11h38
  2. [ Debutant ][ Jar ] Accès fichier externe depuis Jar
    Par Warz dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 22/05/2006, 11h32
  3. [JAR]Modification de fichier dans un jar
    Par vberetti dans le forum Général Java
    Réponses: 14
    Dernier message: 13/06/2005, 17h56
  4. [JAR] lire un fichier dans un jar OU hors d'un jar
    Par yveslamand dans le forum Général Java
    Réponses: 13
    Dernier message: 25/04/2005, 14h38
  5. [JAR] Accéder à un fichier dans un jar
    Par Nanoua dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 06/07/2004, 13h00

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