Obtener el flujo de entrada de un recurso classpath (archivo XML)

81

En la aplicación web Java, suponga que si quiero obtener el InputStream de un archivo XML, que se coloca en CLASSPATH (es decir, dentro del carpeta de fuentes ), ¿cómo lo hago?

Veera
fuente

Respuestas:

99

ClassLoader.getResourceAsStream().

Como se indica en el comentario a continuación, si se encuentra en un ClassLoaderentorno múltiple (como pruebas unitarias, aplicaciones web, etc.), es posible que deba usar Thread.currentThread().getContextClassLoader(). Consulte http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 .

cletus
fuente
Ver publicación personal para un ejemplo de código: tshikatshikaaa.blogspot.nl/2012/07/…
Jérôme Verstrynge
14
Si se encuentra en un entorno de cargadores de clases múltiples (como pruebas unitarias / aplicaciones web, etc.), es posible que deba usar este Thread.currentThread (). GetContextClassLoader (). Ver stackoverflow.com/questions/2308188/…
khylo
¡Agregue la sugerencia de @ khylo a su respuesta!
froginvasion
8
Otra forma:InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei
1
@zhuguowei ClassPathResource es una clase de Spring.
ichalos
31
ClassLoader.class.getResourceAsStream("/path/file.ext");
jkarretero
fuente
pero si implementa la aplicación web en Tomcat de esta manera, obtendrá el error:, java.lang.NullPointerException: null y la forma más simple que creo esnew ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei
¿Puede decirnos cómo hacerlo disponible en la guerra
Vikram Saini
Tengo el mismo problema cuando lo implemento. ¿Alguien puede encontrar una solución a esta situación?
Augusto
12

Eso depende de dónde esté exactamente el archivo XML. ¿Está en la carpeta de fuentes (en el "paquete predeterminado" o en la "raíz") o en la misma carpeta que la clase?

En el primer caso, debe utilizar "/file.xml " (observe la barra inclinada) para encontrar el archivo y no importa qué clase use para intentar localizarlo.

Si el archivo XML está al lado de alguna clase, SomeClass.class.getResourceAsStream()solo con el nombre del archivo es el camino a seguir.

Aaron Digulla
fuente
11

ClassLoader.class.getResourceAsStream("/path/to/your/xml") y asegúrese de que su script de compilación esté copiando el archivo xml en el lugar de su CLASSPATH.

Clint
fuente
6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();

mP.
fuente
o getClass().getResourceAsStream("...")etc
rogerdpack
4

Algunas de las opciones "getResourceAsStream ()" en esta respuesta no me funcionaron, pero esta sí:

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

usuario64141
fuente
0

Intenté la solución propuesta y la barra diagonal en el nombre del archivo no me funcionó, ejemplo: ... (). GetResourceAsStream ("/ my.properties"); se devolvió nulo

La eliminación de la barra funcionó: .... getResourceAsStream ("my.properties");

Aquí es de la API de documentación: antes de la delegación, se construye un nombre de recurso absoluto a partir del nombre de recurso dado utilizando este algoritmo:

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'). 
Huelguista
fuente
En mi caso, me estaba quedando null sin el /. Agregar el carácter de barra funcionó para mí. Debe haber alguna otra diferencia entre @ hussein-terek y mi configuración y tu configuración.
Ajoy Bhatia