Comment puis-je lire un fichier de ressources à partir d'un fichier jar Java?
J'essaye d'accéder à un fichier XML dans un fichier jar, à partir d'un autre pot qui s'exécute comme une application de bureau. Je peux obtenir l'URL du fichier que j'ai besoin, mais quand je passe que pour un FileReader (comme une Chaîne de caractères), je reçois un FileNotFoundException en disant: "Le nom de fichier, le nom du répertoire ou de la syntaxe du nom de volume est incorrecte."
Comme un point de référence, je n'ai aucun problème de lecture de l'image des ressources à partir de la même bocal, en passant l'URL d'une ImageIcon constructeur. Cela semble indiquer que la méthode que j'utilise pour obtenir l'URL est correcte.
URL url = getClass().getResource("/xxx/xxx/xxx/services.xml");
ServicesLoader jsl = new ServicesLoader( url.toString() );
À l'intérieur de la ServicesLoader classe j'ai
XMLReader xr = XMLReaderFactory.createXMLReader();
xr.setContentHandler( this );
xr.setErrorHandler( this );
xr.parse( new InputSource( new FileReader( filename )));
Quel est le problème avec l'utilisation de cette technique pour lire le fichier XML?
- Pouvez-vous poster le code de travail?
Vous devez vous connecter pour publier un commentaire.
Dirait que vous voulez utiliser
java.lang.Class.getResourceAsStream(String)
, voirhttp://java.sun.com/javase/6/docs/api/java/lang/Class.html#getResourceAsStream(java.lang.Chaîne de caractères)
Vous ne dites pas si c'est un ordinateur de bureau ou une application web. Je voudrais utiliser le
getResourceAsStream()
méthode d'un chargeur de classe si c'est un ordinateur de bureau ou le Contexte si c'est une application web.Il semble que si vous utilisez le
URL.toString
résultat que l'argument de laFileReader
constructeur.URL.toString
est un peu cassé, et au lieu de cela, vous devez utiliser généralementurl.toURI().toString()
. En tout cas, la chaîne n'est pas un chemin d'accès au fichier.Au lieu de cela, vous devez:
URL
àServicesLoader
et de le laisser appeleropenStream
ou similaire.Class.getResourceAsStream
et vient de passer le flux, éventuellement à l'intérieur d'unInputSource
. (N'oubliez pas de vérifier les valeurs null comme l'API est un peu brouillon.)Le problème était que j'allais trop loin dans l'appel de la méthode d'analyse de XMLReader. La méthode parse accepte un InputSource, donc il n'y a pas de raison d'utiliser un FileReader. Modification de la dernière ligne du code ci-dessus pour
fonctionne très bien.
Je tiens à souligner que l'un des problèmes est que si les mêmes ressources sont dans plusieurs fichiers jar.
Disons que vous voulez lire /org/node/foo.txt mais pas à partir d'un fichier, mais à partir de chaque fichier jar.
J'ai rencontré ce même problème plusieurs fois avant.
J'espérais dans le JDK 7 que quelqu'un serait d'écrire un classpath du système de fichiers, mais hélas pas encore.
Printemps a la classe de Ressource qui vous permet de charger le classpath de ressources tout à fait bien.
J'ai écrit un petit prototype de résoudre ce problème de ressources de lecture de plusieurs fichiers jar. Le prototype ne gère pas tous les cas de bord, mais il ne poignée de chercher des ressources dans les répertoires qui sont dans les fichiers jar.
J'ai utilisé un Débordement de Pile très peu de temps. C'est la deuxième réponse que je me souviens de répondre à une question, donc pardonnez-moi si je vais trop long (c'est ma nature).
C'est un prototype de ressources reader. Le prototype est dépourvue de robuste de vérification d'erreur.
J'ai deux prototypes de fichiers jar que j'ai de l'installation.
Les fichiers jar ont chacun un fichier sous /org/node/a appelé resource.txt.
C'est juste un prototype de ce qu'est un gestionnaire pourrait ressembler à classpath://
J'ai aussi un resource.foo.txt dans mon local de ressources pour ce projet.
Il les ramasse et les imprime sur.
Vous pouvez voir un fuller exemple ici avec l'exemple de sortie.
À l'extérieur de votre technique, pourquoi ne pas utiliser le standard Java Jarfiles classe pour obtenir les références qui vous intéressent? À partir de là, la plupart de vos problèmes devraient disparaître.
Si vous utiliser les ressources de manière extensive, vous pourriez envisager d'utiliser
Communes VFS.
Prend également en charge:
* Les Fichiers Locaux
* FTP, SFTP
* Les protocoles HTTP et HTTPS
* Fichiers temporaires "normal FS soutenu)
* Zip, Jar et de Goudron (non compressé, tgz ou tbz2)
* gzip et bzip2
* ressources
* ram - "ramdrive"
* mime
Il y a aussi JBoss VFS - mais ce n'est pas très documenté.
J'ai 2 fichiers CSV que j'utilise pour lire les données. Le programme java est exporté comme un runnable jar file. Lorsque vous exportez, vous découvrirez qu'il n'est pas exporter vos ressources avec elle.
J'ai ajouté un dossier dans le cadre du projet appelé de données dans eclipse. Dans ce dossier j'ai stocké mes fichiers csv.
Quand j'ai besoin de faire référence à ces fichiers j'ai fais comme ça...
Puis quand vous mettez le pot dans un endroit de sorte qu'il peut être exécuté via la ligne de commande, assurez-vous d'ajouter le dossier de données avec les ressources dans le même emplacement que le fichier jar.
Voici un exemple de code sur comment lire un fichier à l'intérieur d'un fichier jar (dans ce cas, le courant de l'exécution de fichier jar)
Il suffit de changer exécutable avec le chemin de votre fichier jar si elle n'est pas en cours d'exécution dans un.
Puis modifiez le chemin d'accès au chemin d'accès du fichier que vous souhaitez utiliser à l'intérieur du fichier jar. I. E. si votre fichier est en
. Définir le chemin d'accès à l' "img\test.gif"