Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1474 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] Lister les fichiers d'un répertoire d'un JAR

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JAVA] Lister les fichiers d'un répertoire d'un JAR

n°813909
Sigmund
Posté le 03-08-2004 à 17:01:16  profilanswer
 

Salut à tous,
 
J'ai un jeu développé en JAVA et qui est évidemment contenu dans un JAR une fois compilé. Dans ce fichier JAR, j'ai un répertoire qui contient des fichiers son. J'ai également une classe qui s'occupe de charger tous les fichiers contenus dans ce répertoire. Le problème est le suivant : lorsque l'application n'est pas dans un JAR, je parviens à lister les fichiers du répertoire à l'aide de getResourceAsStream("sons/" ). Par contre, lorsque j'utilise le JAR, cela ne fonctionne pas : le flux renvoyé par getResourceAsStream("sons/" ) est vide...
 
Je n'ai rien trouvé à ce sujet sur le forum mais sur cette page http://forum.java.sun.com/thread.j [...] &trange=15
dans le 3e post, il est indiqué qu'un JAR ne possède pas d'entrée pour les répertoires. Qu'en pensez-vous ? Est-ce que ce que je veux faire est possible ?
 
Merci d'avance.


Message édité par Sigmund le 03-08-2004 à 17:02:16
mood
Publicité
Posté le 03-08-2004 à 17:01:16  profilanswer
 

n°814083
teut
Posté le 03-08-2004 à 19:31:06  profilanswer
 

ben je pense qu'il faut que tu utilise le classloader, et de cette maniere tu peux recup le fichier, si ton fichier recherché est présent dans un jar indiqué dans le classpath.
 
Voila un ptit exemple...

Code :
  1. public class Test {
  2. public static void main(String[] args) {
  3.  // afficher l'usage si mauvaise utilisation
  4.  if (args.length != 1) {
  5.   System.out.println("usage : java -cp [jarContenantAuMoinsLeFichier] Test [fileName]" );
  6.   System.exit(0);
  7.  }
  8.  // on recupere le fichier qui doit etre dansun jar appartenant au
  9.  // classpath
  10.  ClassLoader cl = Test.class.getClassLoader();
  11.  InputStream is = cl.getResourceAsStream(args[0]) ;
  12.  if (is == null) {
  13.   // impossible de recuperer le fichier
  14.   System.out.println("Impossible de recuperer le fichier" ) ;
  15.   System.exit(0) ;
  16.  }
  17.  // analyse du fichier, c juste un test pour verifier que ca marche
  18.  BufferedReader reader = new BufferedReader(new InputStreamReader(is));
  19.  // on affiche le contenu du fichier
  20.  System.out.println("FICHIER : " );
  21.  try {
  22.   String temp = reader.readLine();
  23.   while (temp != null) {
  24.    System.out.println(temp);
  25.    temp = reader.readLine();
  26.   }
  27.  } catch (IOException e) {
  28.   System.out.println("Impossible de lire le fichier" );
  29.   e.printStackTrace();
  30.  }
  31. }
  32. }


Message édité par teut le 03-08-2004 à 19:38:59
n°814172
Sigmund
Posté le 03-08-2004 à 20:42:01  profilanswer
 

Tout d'abord merci pour ta réponse.
 
J'ai essayé ton code et je m'attendais plus ou moins au résultat produit (vu que j'avais essayé quelque chose de similaire).
 
J'ai donc repris ta classe, je l'ai compilée et j'ai créé un JAR la contenant ainsi qu'un répertoire "Essai" (original, non ? :D) contenant lui-même deux fichiers non vides (Fichier1.txt et Fichier2.txt).
 
J'ai donc :


jar cmfv MANIFEST.MF Test.jar Test.class Essai/


ce qui donne :


Test.jar --> Test.class
         --> Essai --> Fichier1.txt Fichier2.txt
         --> META-INF --> MANIFEST.MF


J'obtiens :


$ java -jar Test.jar Essai/
FICHIER :  


Bref, un flux vide :( !
Si je lance le programme sans le JAR, j'ai :


$ java Test Essai/
FICHIER :  
Fichier1.txt
Fichier2.txt


Le résultat que j'attends...
 
Donc, la question reste posée mais je te remercie quand même. Je m'y prends peut-être mal mais je ne vois pas comment faire autrement (ou alors en passant par java.util.jar.* mais je me dis qu'il y a peut-être moyen sans).


Message édité par Sigmund le 03-08-2004 à 20:42:32
n°814228
teut
Posté le 03-08-2004 à 21:33:36  profilanswer
 

désolé je n'avais pas clairement compris ton pb,  
en fait tu ne connais pas les noms des fichiers sons, mais tu cherches à les récupérer par rapport à leur localisation ?...

n°814558
Sigmund
Posté le 04-08-2004 à 11:04:04  profilanswer
 

C'est ça, je cherche à charger tous les fichiers du répertoire "sons" et donc il faudrait que je parvienne à lister le contenu de ce répertoire.


Message édité par Sigmund le 04-08-2004 à 11:04:52
n°815139
teut
Posté le 04-08-2004 à 17:52:16  profilanswer
 

en fait je comprends pas trop pourquoi ton dossier contenant les sons est compris dans le jar...
Car si tu le met dans ton jar, cela veut dire que l'utilisateur n'aura pas accès à ce dossier, donc il ne pourra pas rajouter des sons entre les executions, et donc dans ce cas là le contenu n'étant pas cencé évoluer on peut définir un fichier sons.properties qui pourrait définir le nom de chaque fichier sons...
mais si on veut pouvoir changer le contenu de ce dossier régulièrement je ne comprends pas pourquoi il devrait être contenu dans le jar. pour moi le jar doit contenir les classes et les éléments de ton éxécution qui sont fixe (icones, dtd...)
 
Sinon j'ai modifié le code de l'example afin qu'il liste les fichiers contenu dans un jar, mais ce jar doit être accessible à travers le classpath, mais ne doit pas être chargé directement par le classpath (on doit faire référence à la localisation de ce jar et non directement au fichier jar), donc dans ton cas je pense pas que ca puisse te servir bcp, car il faudrait que tes sons soit dans un jar appartenant au jar global de l'application.
 

Code :
  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.util.jar.JarEntry;
  4. import java.util.jar.JarInputStream;
  5. public class Test {
  6. public static void main(String[] args) {
  7.  // afficher l'usage si mauvaise utilisation
  8.  if (args.length != 1) {
  9.   System.out.println("usage : java Test [jarName]" );
  10.   System.exit(0);
  11.  }
  12.  // on recupere le fichier  
  13.  ClassLoader cl = Test.class.getClassLoader();
  14.  InputStream is = cl.getResourceAsStream(args[0]) ;
  15.  if (is == null) {
  16.   // impossible de recuperer le fichier
  17.   System.out.println("Impossible de recuperer le fichier" ) ;
  18.   System.exit(0) ;
  19.  }
  20.  try {
  21.   // liste les différentes entrées du fichier jar
  22.   JarInputStream jis = new JarInputStream(is) ;
  23.   JarEntry temp = jis.getNextJarEntry() ;
  24.   while (temp != null) {
  25.    System.out.print(temp.getName()) ;
  26.    if (temp.isDirectory())
  27.     System.out.println(" -> Repertoire" ) ;
  28.    else
  29.     System.out.println(" -> Fichier" ) ;
  30.    temp = jis.getNextJarEntry() ;
  31.   }
  32.  } catch (IOException e) {
  33.   System.out.println("Impossible de lire le jar" );
  34.   e.printStackTrace();
  35.  }
  36. }
  37. }


 
De plus je n'ai aucune idée de la manière dont on récupère le contenu d'un élément 'JarEntry'...  

n°815238
Sigmund
Posté le 04-08-2004 à 19:42:01  profilanswer
 

Je pense que tu as raison, je vais un peu réfléchir à tout cela.
 
Merci beaucoup en tout cas.

n°815425
patachou
Posté le 05-08-2004 à 00:09:40  profilanswer
 

Peut etre qu'il ne manque pas grand chose a ton code initial :
 

Citation :

getResourceAsStream("sons/" ) est vide


Peut etre il manque juste un / au début car écrit comme ca c'est un chemin relatif par rapport à l'endroit ou de la classe ou getResourceAsStream () est appelé. En mettant un / au début, on se positionne à la racine (du jar ou là ou la commande java à été executé).
J'ai un bon cours sur les jar et l'acces au ressource :
http://deptinfo.unice.fr/~grin/mes [...] stemeA.pdf
 
En espérant que ca puisse t'aider...

n°815613
pascal34
one point !
Posté le 05-08-2004 à 10:51:18  profilanswer
 

Regarde du côté de la classe JarFile.

n°815878
Sigmund
Posté le 05-08-2004 à 14:05:02  profilanswer
 

patachou a écrit :

Peut etre qu'il ne manque pas grand chose a ton code initial :
 

Citation :

getResourceAsStream("sons/" ) est vide


Peut etre il manque juste un / au début car écrit comme ca c'est un chemin relatif par rapport à l'endroit ou de la classe ou getResourceAsStream () est appelé. En mettant un / au début, on se positionne à la racine (du jar ou là ou la commande java à été executé).
J'ai un bon cours sur les jar et l'acces au ressource :
http://deptinfo.unice.fr/~grin/mes [...] stemeA.pdf
 
En espérant que ca puisse t'aider...


 
Je ne pense pas que ce soit cela, car s'il manquait un slash avant "sons", le chemin vers la ressource ne serait pas correcte et la référence renvoyée serait null. Ici, la référence renvoyée est différente de null mais le flux est vide...
 
Merci pour le cours, c'est pas mal du tout.


Message édité par Sigmund le 05-08-2004 à 14:07:16
mood
Publicité
Posté le 05-08-2004 à 14:05:02  profilanswer
 

n°815884
Sigmund
Posté le 05-08-2004 à 14:06:42  profilanswer
 

pascal34 a écrit :

Regarde du côté de la classe JarFile.


 
Je vais jeter un coup d'oeil, c'est d'ailleurs ce que m'a proposé teut.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] Lister les fichiers d'un répertoire d'un JAR

 

Sujets relatifs
Petite question à propos de l'accès en mode binaire des fichiers...[JAVA] supprimer les caractères spéciaux dans une chaine
blem avec une archive jar[JAVA] Base de données orientée objet & OZONE
[C++] Porter du Java en C++[Java][PHP][SQL] Debutant: Par quoi commencer??
[java][mysql] probleme de connection [Shell - Rsh - Java] Rendez moi la main !
Fenetre non régulière en Java 
Plus de sujets relatifs à : [JAVA] Lister les fichiers d'un répertoire d'un JAR


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR