web-dev-qa-db-fra.com

Obtenir le flux d'entrée à partir d'une ressource de chemin de classe (fichier XML)

Dans une application Web Java, supposons que si je souhaite obtenir le flux InputStream d’un fichier XML placé dans CLASSPATH (dans le dossier sources , par exemple), comment procéder?

69
Veera

ClassLoader.getResourceAsStream() .

Comme indiqué dans le commentaire ci-dessous, si vous êtes dans un environnement multi -ClassLoader (test d'unité, applications Web, etc.), vous devrez peut-être utiliser Thread.currentThread().getContextClassLoader(). Voir http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 .

86
cletus
ClassLoader.class.getResourceAsStream("/path/file.ext");
29
jkarretero

Cela dépend de l'emplacement exact du fichier XML. Est-ce dans le dossier sources (dans le "paquet par défaut" ou la "racine") ou dans le même dossier que la classe?

Dans le cas précédent, 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.

12
Aaron Digulla

ClassLoader.class.getResourceAsStream("/path/to/your/xml") et assurez-vous que votre script de compilation copie le fichier xml vers où dans votre CLASSPATH. 

11
Clint

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();

6
mP.

Certaines des options "getResourceAsStream ()" de cette réponse n'ont pas fonctionné pour moi, mais celle-ci a fonctionné:

SomeClassWithinYourSourceDir.class.getClassLoader (). GetResourceAsStream ("yourResource");

4
user64141

J'ai essayé la solution proposée et la barre oblique dans le nom du fichier ne fonctionnait pas, par exemple: ... (). GetResourceAsStream ("/ my.properties"); null a été retourné

Supprimer la barre oblique a fonctionné: .... getResourceAsStream ("my.properties"); 

Voici de la doc API: Avant la délégation, un nom de ressource absolu est construit à partir du nom de ressource donné 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'). 
0
Striker