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

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

Marsh Posté le 03-08-2004 à 17:01:16    

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
Reply

Marsh Posté le 03-08-2004 à 17:01:16   

Reply

Marsh Posté le 03-08-2004 à 19:31:06    

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
Reply

Marsh Posté le 03-08-2004 à 20:42:01    

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
Reply

Marsh Posté le 03-08-2004 à 21:33:36    

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 ?...

Reply

Marsh Posté le 04-08-2004 à 11:04:04    

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
Reply

Marsh Posté le 04-08-2004 à 17:52:16    

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'...  

Reply

Marsh Posté le 04-08-2004 à 19:42:01    

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

Reply

Marsh Posté le 05-08-2004 à 00:09:40    

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...

Reply

Marsh Posté le 05-08-2004 à 10:51:18    

Regarde du côté de la classe JarFile.

Reply

Marsh Posté le 05-08-2004 à 14:05:02    

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
Reply

Marsh Posté le 05-08-2004 à 14:05:02   

Reply

Marsh Posté le 05-08-2004 à 14:06:42    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed