Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

GetResourceAsStream sur un repertoire

4 réponses
Avatar
frisco
Bonjour,
J'ai packagé une appli dans un jar, et dans mon code, je récupère un
InputStream sur des fichiers de ce jar en utilisant le classique
getResourceAsStream(FileName) de l'objet Class. Ca ca marche, pas de pb.

Or, je souhaite pouvoir lire le contenu d'un "repertoire" du jar, comme
le fait la méthode "File.listFiles();"

Or , un getResourceStream() sur un repertoire du jar ne donne rien a
priori. J'ai bien un InputStream, mais je peux rien en faire.

Pareil avec getResource(dirName). J'ai bien une URL qui "pointe" dans le
jar, mais de toute façon, je peux rien en faire.

Donc:

InputStream is = this.getClass().getResourceAsStream("myDirInTheJar");
is.read() ==> throw exception

Exception in thread "main" java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:66)
at MainClass.main(MainClass.java:256)

Cela veut-til dire que je suis bon pour passer par java.utils.jar.*?

D'avance merci

François

4 réponses

Avatar
Black Myst
Salut,

Je ne sais pas trop ce que tu veux faire, mais tu me semble mal
partie... Il n'y a pas de répertoire dans une un JAR, donc pas de
moyen de lire.

Quel est ton objectif ? Il y a surement une autre façon de faire...

Black Myst


Bonjour,
J'ai packagé une appli dans un jar, et dans mon code, je récupère un
InputStream sur des fichiers de ce jar en utilisant le classique
getResourceAsStream(FileName) de l'objet Class. Ca ca marche, pas de pb.

Or, je souhaite pouvoir lire le contenu d'un "repertoire" du jar, comme
le fait la méthode "File.listFiles();"

Or , un getResourceStream() sur un repertoire du jar ne donne rien a
priori. J'ai bien un InputStream, mais je peux rien en faire.

Pareil avec getResource(dirName). J'ai bien une URL qui "pointe" dans le
jar, mais de toute façon, je peux rien en faire.

Donc:

InputStream is = this.getClass().getResourceAsStream("myDirInTheJar");
is.read() ==> throw exception

Exception in thread "main" java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:66)
at MainClass.main(MainClass.java:256)

Cela veut-til dire que je suis bon pour passer par java.utils.jar.*?

D'avance merci

François


Avatar
frisco
Bonjour,
Enfin, quand je parle de Repertoire, je parle de notion d'arborescence.
Un jar, c'est un zip (grosso-modo), et le zip gere la notin d'arborescence.
Je souhaite pouvoire recupérer une resourceStream sur un "repertoire" au
sens jar.
Mais j'en suis quitte pour passer par l'API Zp ou Jar

François

Salut,

Je ne sais pas trop ce que tu veux faire, mais tu me semble mal
partie... Il n'y a pas de répertoire dans une un JAR, donc pas de
moyen de lire.

Quel est ton objectif ? Il y a surement une autre façon de faire...

Black Myst


Bonjour,
J'ai packagé une appli dans un jar, et dans mon code, je récupère un
InputStream sur des fichiers de ce jar en utilisant le classique
getResourceAsStream(FileName) de l'objet Class. Ca ca marche, pas de pb.

Or, je souhaite pouvoir lire le contenu d'un "repertoire" du jar,
comme le fait la méthode "File.listFiles();"

Or , un getResourceStream() sur un repertoire du jar ne donne rien a
priori. J'ai bien un InputStream, mais je peux rien en faire.

Pareil avec getResource(dirName). J'ai bien une URL qui "pointe" dans
le jar, mais de toute façon, je peux rien en faire.

Donc:

InputStream is = this.getClass().getResourceAsStream("myDirInTheJar");
is.read() ==> throw exception

Exception in thread "main" java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:66)
at MainClass.main(MainClass.java:256)

Cela veut-til dire que je suis bon pour passer par java.utils.jar.*?

D'avance merci

François




Avatar
Black Myst
Utiliser l'API zip pour explorer le contenu d'un JAR pour retrouver ses
fichiers dans le classpath n'est pas une très bonne solution. C'est
typiquement le genre de chose qui donne la migraine au moment du
packaging de l'application.

D'ailleurs, j'imagine que ton application marchait très bien avec tous
ses fichiers en FS, mais que ca ne marche plus depuis que tu essaie de
la mettre dans un JAR. Et ça pourrait encore te poser des problèmes si
tu essaie un jour de l'exécuter via WebStart ou de bidouiller le
classpath/ClassLoader de quelque manière que ce soit.

Le classloader est responsable de trouver les ressources que demande ton
application, mais il n'est pas possible de lui demander la liste des
ressources disponibles. C'est pas toujours pratique, mais il faut faire
avec.

Je ne sais pas exactement dans quel but tu cherche à connaître la liste
des fichiers d'un répertoire, mais la bonne solution est de mettre la
liste des fichiers/ressources dont ton application à besoin dans un
fichier de configuration. Le classloader y accédera sans problème que
ton application soit packagé dans un JAR, ou simplement en fichiers sur
ton disque.

Black Myst

Bonjour,
Enfin, quand je parle de Repertoire, je parle de notion d'arborescence.
Un jar, c'est un zip (grosso-modo), et le zip gere la notin d'arborescence.
Je souhaite pouvoire recupérer une resourceStream sur un "repertoire" au
sens jar.
Mais j'en suis quitte pour passer par l'API Zp ou Jar

François

Salut,

Je ne sais pas trop ce que tu veux faire, mais tu me semble mal
partie... Il n'y a pas de répertoire dans une un JAR, donc pas de
moyen de lire.

Quel est ton objectif ? Il y a surement une autre façon de faire...

Black Myst


Bonjour,
J'ai packagé une appli dans un jar, et dans mon code, je récupère un
InputStream sur des fichiers de ce jar en utilisant le classique
getResourceAsStream(FileName) de l'objet Class. Ca ca marche, pas de pb.

Or, je souhaite pouvoir lire le contenu d'un "repertoire" du jar,
comme le fait la méthode "File.listFiles();"

Or , un getResourceStream() sur un repertoire du jar ne donne rien a
priori. J'ai bien un InputStream, mais je peux rien en faire.

Pareil avec getResource(dirName). J'ai bien une URL qui "pointe" dans
le jar, mais de toute façon, je peux rien en faire.

Donc:

InputStream is = this.getClass().getResourceAsStream("myDirInTheJar");
is.read() ==> throw exception

Exception in thread "main" java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:66)
at MainClass.main(MainClass.java:256)

Cela veut-til dire que je suis bon pour passer par java.utils.jar.*?

D'avance merci

François






Avatar
Hervé AGNOUX
frisco wrote:


Cela veut-til dire que je suis bon pour passer par java.utils.jar.*?



Je pense que oui. Mais...

Perso en ce cas j'utilise une autre technique.

Je place dans le jar un zip, que j'accéde en tant que ressource. La première
fois que l'appli se lance, je dézippe cette ressource dans un répertoire
local. Puis j'accède à ces données en mode fichier, ce qui est largement
plus pratique.

Cela nécessite plusieurs choses : avoir les droits d'écriture en local, être
capable de détecter que l'appli se lance pour la première fois, et être
capable de mémoriser le répertoire dans lequel on a dézipé le zip. (et,
bien sûr, être capable de dézipper un zip).

Mais je trouve que le jeu en vaut la chandelle.

Cordialement.


--
Hervé AGNOUX
http://www.diaam-informatique.com