Dans l'application Web Java, Supposons que je souhaite obtenir l'InputStream d'un fichier XML placé dans CLASSPATH (c'est-à-dire dans le dossier sources). Je le fais?Obtention de l'inputtream à partir d'une ressource classpath (fichier XML)
Répondre
ClassLoader.getResourceAsStream()
.
Comme indiqué dans le commentaire ci-dessous, si vous vous trouvez dans un environnement multi-environnement (tests unitaires, webapps, etc.), vous devrez peut-être utiliser Thread.currentThread().getContextClassLoader()
. Voir http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388.
someClassWithinYourSourceDir.getClass(). GetResourceAsStream();
ou 'getClass(). GetResourceAsStream (" ... ")' etc – rogerdpack
Cela dépend de l'emplacement exact du fichier XML. Est-ce dans le dossier sources (dans le "package par défaut" ou le "root") ou dans le même dossier que la classe?
Dans le premier cas, vous devez utiliser "/file.xml
" (notez la barre oblique) pour trouver le fichier et peu importe la classe que vous utilisez pour essayer de le localiser.
Si le fichier XML est à côté d'une classe, SomeClass.class.getResourceAsStream()
avec juste le nom de fichier est le chemin à parcourir.
ClassLoader.class.getResourceAsStream("/path/to/your/xml")
et assurez-vous que votre script de compilation copie le fichier xml dans votre CLASSPATH.
ClassLoader.class.getResourceAsStream("/path/file.ext");
mais si déployer web app dans Tomcat de cette façon obtiendra erreur: 'java.lang.NullPointerException: null', et la façon la plus simple je pense est 'new ClassPathResource ("/chemin/vers/votre/fichier "). getInputStream()' – zhuguowei
Certains des "getResourceAsStream()" options dans cette réponse ne fonctionne pas pour moi, mais celui-ci a fait.
SomeClassWithinYourSourceDir.class.getClassLoader() getResourceAsStream ("yourResource");
Par défaut, chaque ressource ajoutée au classpath dans une application Web est copié sous dossier WEB-INF/classes dans la guerre déployée.
vous pouvez gérer ce tout en développant l'application dans Eclipse par:
projet Clic droit -> propriétés -> Chemin de génération Java -> onglet Source -> dossier de sortie par défaut
Dans votre servlet, vous pouvez accéder à la ressource en préfixant son chemin avec '/' qui pointe vers WEB-INF/classes.
Par exemple, Pour accéder à pdf-exemple.pdf sous WEB-INF/classes, vous pouvez utiliser les éléments suivants:
getClass().getResourceAsStream("/pdf-sample.pdf")
Ce tutorial explique très bien les moyens possibles de lecture un fichier de ressources de classpath dans une application Java, ça vaut le coup de lire.
J'ai essayé la solution proposée et la barre oblique dans le nom de fichier n'a pas fonctionné pour moi, par exemple: ...(). GetResourceAsStream ("/ my.properties"); null a été renvoyé
Suppression de la barre oblique: .... getResourceAsStream ("my.Propriétés "),
Voici de l'API doc: Avant délégation, un nom de ressource absolue est construit à partir du nom de la ressource donnée en utilisant cet algorithme:
If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
Otherwise, the absolute name is of the following form:
modified_package_name/name
Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e').
Voir message personnel pour un exemple de code: http://tshikatshikaaa.blogspot.nl/2012/07/maven-how-to-access-filesdata-in.html – JVerstry
Si vous êtes dans un environnement multi-chargeurs (tel que tests unitaires/webapps etc), vous devrez peut-être utiliser ce thread .currentThread(). getContextClassLoader(). Voir http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 – khylo
Veuillez ajouter la suggestion de @ khylo à votre réponse! – froginvasion