getResourceAsStream devuelve nulo

Resuelto asked hace 11 años • 28 respuestas

Estoy cargando un archivo de texto desde un paquete en un JAR compilado de mi proyecto Java. La estructura de directorio relevante es la siguiente:

/src/initialization/Lifepaths.txt

Mi código carga un archivo llamando Class::getResourceAsStreampara devolver un archivo InputStream.

public class Lifepaths {
    public static void execute() {
        System.out.println(Lifepaths.class.getClass().
            getResourceAsStream("/initialization/Lifepaths.txt"));
    }

    private Lifepaths() {}

    //This is temporary; will eventually be called from outside
    public static void main(String[] args) {execute();}
}

La impresión siempre se imprimirá null, sin importar lo que use. No estoy seguro de por qué lo anterior no funcionaría, así que también intenté:

  • "/src/initialization/Lifepaths.txt"
  • "initialization/Lifepaths.txt"
  • "Lifepaths.txt"

Ninguno de estos funciona. He leído numerosas preguntas hasta ahora sobre el tema, pero ninguna ha sido útil; por lo general, solo dicen que cargue archivos usando la ruta raíz, lo cual ya estoy haciendo. Eso, o simplemente cargar el archivo desde el directorio actual (simplemente cargar filename), lo cual también probé. El archivo se está compilando en el JAR en la ubicación adecuada con el nombre adecuado.

¿Cómo puedo solucionar esto?

 avatar May 15 '13 23:05
Aceptado

Lifepaths.class.getClass().getResourceAsStream(...)carga recursos usando el cargador de clases del sistema, obviamente falla porque no ve sus archivos JAR

Lifepaths.class.getResourceAsStream(...)carga recursos usando el mismo cargador de clases que cargó la clase Lifepaths y debería tener acceso a los recursos en sus JAR

Al invocar getResourceAsStream(nombre), el nombre debe comenzar con "/". No estoy seguro de si esto es necesario, pero tengo un problema sin él.

hoaz avatar May 15 '2013 17:05 hoaz

Las reglas son las siguientes:

  1. verifique la ubicación del archivo que desea cargar dentro del JAR (y así también asegúrese de que realmente se haya agregado al JAR)
  2. use una ruta absoluta: la ruta comienza en la raíz del JAR
  3. use una ruta relativa: la ruta comienza en el directorio del paquete de la clase a la que está llamando getResource/ getResoucreAsStream

Y prueba:

Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")

en lugar de

Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")

(No estoy seguro si hace una diferencia, pero el primero usará el ClassLoader/JAR correcto, mientras que no estoy seguro con el segundo)

Puce avatar May 15 '2013 16:05 Puce