Comment puis-je obtenir une ressource “Dossier” de l'intérieur de mon Fichier jar?
J'ai un dossier de ressources/paquet dans la racine de mon projet, je "ne" voulez charger un Fichier donné. Si j'ai voulu charger certains Fichiers, je voudrais l'utiliser en classe.getResourceAsStream et je serait bien!! Ce que je veux faire est de charger un "Dossier" dans le dossier de ressources, en boucle sur les Fichiers à l'intérieur de ce Dossier et obtenir un Flux de données de chaque fichier et lire le contenu... Supposons que les noms de Fichiers ne sont pas déterminés avant l'exécution... Que dois-je faire? Est-il possible d'obtenir une liste des fichiers contenus dans un Dossier dans votre Fichier jar?
Notez que le fichier Jar avec les ressources est le même fichier jar à partir de laquelle le code est exécuté...
Merci d'avance...
- Ce serait aider : stackoverflow.com/questions/1529611/...
- Voir aussi: stackoverflow.com/questions/4764347/...
- Le Premier est sur l'extraction d'un fichier jar, qui est en quelque sorte la dernière chose que je veux essayer, comme un si-pire-est-pour-le pire!! Si je veux les fichiers extraits, je voudrais juste les mettre dans mon dossier d'installation au moment de l'installation! Je veux y accéder à partir de l'intérieur du bocal, et ma raison est, si getResourceAsStream peut accéder à un Fichier, Java devraient également être en mesure d'explorer les dossiers en pot, sans avoir à l'extraire!! Mais merci...
Vous devez vous connecter pour publier un commentaire.
Enfin, j'ai trouvé la solution:
Le deuxième bloc de travail lorsque vous exécutez l'application sur les IDE (pas avec le fichier jar), Vous pouvez le supprimer si vous n'aimez pas cela.
Essayez les solutions suivantes.
Faire le chemin d'accès aux ressources
"<PathRelativeToThisClassFile>/<ResourceDirectory>"
E. g. si votre chemin de classe est com.abc.package.MyClass et votre resoure fichiers sont dans le dossier src/com/abc/package/ressources/:Vous pouvez également utiliser
File
classe. Ce code ne fonctionne pas avec les ressources à l'intérieur d'un fichier JAR. Période.java.lang.IllegalArgumentException: URI is not hierarchical
exceptionJe sais que c'est il y a plusieurs années . Mais seulement pour d'autres gens viennent à travers cette rubrique.
Ce que vous pourriez faire est d'utiliser
getResourceAsStream()
méthode avec le chemin d'accès au répertoire, et le Flux d'entrée aurez tous les noms de fichiers à partir de ce dir. Après cela, vous pouvez concat la dir chemin avec chaque nom de fichier et l'appel getResourceAsStream pour chaque fichier dans une boucle.J'ai eu le même problème à la main, tandis que j'essayais de charger certains hadoop configurations de ressources emballé dans le jar... à la fois sur les IDE et sur le pot (version release).
J'ai trouvé
java.nio.file.DirectoryStream
à travailler pour parcourir le contenu d'un répertoire à la fois le système de fichiers local et jar.Le code suivant renvoie la "le dossier" en tant que Chemin d'accès, indépendamment de si elle est à l'intérieur d'un pot ou pas.
Nécessite java 7+.
folder
) semble être ignorée lors de la création du système de fichiers. DoncgetPath
ne retourne pasfolder/path/to/...
, mais seulementpath/to/...
.Une autre solution, vous pouvez le faire en utilisant
ResourceLoader
comme ceci:Simple ... utiliser OSGi. Dans OSGi vous pouvez parcourir votre Bundle entrées avec findEntries et findPaths.
À l'intérieur de mon fichier jar que j'avais un dossier appelé Télécharger, ce dossier avait trois autres fichiers de texte à l'intérieur et j'ai besoin d'avoir une exactement le même dossier et des fichiers en dehors du fichier jar, j'ai utilisé le code ci-dessous:
Que les autres réponses soulignent, une fois que les ressources sont à l'intérieur d'un fichier jar, les choses deviennent vraiment laid. Dans notre cas, cette solution:
https://stackoverflow.com/a/13227570/516188
fonctionne très bien dans les tests (depuis quand les tests sont exécutés le code n'est pas emballé dans un fichier jar), mais ne fonctionne pas lorsque l'application fonctionne en fait normalement. Donc ce que j'ai fait, c'est... j'ai coder en dur la liste des fichiers dans l'application, mais j'ai un test qui lit la liste réelle de disque (pouvez le faire depuis que les travaux dans les tests) et échoue si la liste ne correspond pas à la liste de l'application retourne.
Cette façon, j'ai un code simple dans mon application (pas de trucs), et je suis sûr que je n'oublie pas d'ajouter une nouvelle entrée dans la liste grâce à l'essai.
Ce lien vous explique comment.
La magie est la getResourceAsStream() méthode :