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?

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 .


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");

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.


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.


6

someClassWithinYourSourceDir.getClass (). getResourceAsStream ();


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");


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'). 

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.