java - getResourceAsStream devuelve null
getresourceasstream java (11)
@Emracool ... Sugeriría una alternativa. Dado que parece que está intentando cargar un archivo * .txt. Es mejor usar FileInputStream()
lugar de este molesto getClass().getClassLoader().getResourceAsStream()
o getClass().getResourceAsStream()
. Al menos tu código se ejecutará correctamente.
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
El código que se usa para cargar el archivo es:
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 imprimirá null
, sin importar lo que use. No estoy seguro de por qué lo anterior no funcionaría, por lo que también he intentado:
-
"/src/initialization/Lifepaths.txt"
-
"initialization/Lifepaths.txt"
-
"Lifepaths.txt"
Ninguno de estos funciona. I''ve read numerous questions hasta el momento sobre el tema, pero ninguna de ellas ha sido útil; por lo general, solo dicen cargar archivos usando la ruta de acceso de la raíz, que ya estoy haciendo. Eso, o solo cargue el archivo del directorio actual (solo cargue el filename
), que también he intentado. El archivo se está compilando en el JAR en la ubicación adecuada con el nombre apropiado.
¿Cómo puedo solucionar esto?
Asegúrese de que su directorio de recursos (por ejemplo, "src") esté en su classpath (asegúrese de que sea un directorio fuente en su ruta de compilación en eclipse).
Asegúrese de que clazz se carga desde el cargador de clases principal.
Luego, para cargar src / initialization / Lifepaths.txt, use
clazz.getResourceAsStream("/initialization/Lifepaths.txt");
Por qué: clazz.getResourcesAsStream(foo)
busca foo desde el classpath de clazz , en relación con el clazz de directorio en el que vive . El "/" inicial lo carga desde la raíz de cualquier directorio en el classpath de clazz.
A menos que esté en un contenedor de algún tipo, como Tomcat, o esté haciendo algo con ClassLoaders directamente, solo puede tratar su classpath eclipse / command line como el único classpath classpath.
De modo que hay varias formas de obtener un recurso de un contenedor y cada una tiene una sintaxis ligeramente diferente donde la ruta debe especificarse de manera diferente.
La mejor explicación que he visto es este artículo de JavaWorld . Resumiré aquí, pero si quieres saber más, echa un vistazo al artículo.
Métodos
1) ClassLoader.getResourceAsStream()
.
Formato: "/" - nombres separados; sin encabezado "/" (todos los nombres son absolutos).
Ejemplo: this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties");
2) Class.getResourceAsStream()
Formato: "/" - nombres separados; el guiar "/" indica nombres absolutos; todos los otros nombres son relativos al paquete de la clase
Ejemplo: this.getClass().getResourceAsStream("/some/pkg/resource.properties");
Es posible que desee probar esto para obtener la secuencia, es decir, primero obtenga la url y luego ábrala como una secuencia.
URL url = getClass().getResource("/initialization/Lifepaths.txt");
InputStream strm = url.openStream();
Una vez tuve una pregunta similar: la lectura del archivo de texto del contenedor falla pero la lectura de imágenes funciona
Las reglas son las siguientes:
- compruebe la ubicación del archivo que desea cargar dentro del JAR (y así también asegúrese de que realmente se agregue al JAR)
- utilice una ruta absoluta: la ruta comienza en la raíz del JAR
- use una ruta relativa: la ruta comienza en el directorio del paquete de la clase a la que llama 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, aunque no estoy seguro con el último)
Lo que funcionó para mí fue agregar el archivo en Mi Proyecto / Java Resources / src y luego usar
this.getClass().getClassLoader().getResourceAsStream(myfile.txt);
No necesité explicitarme agregar este archivo a la ruta (agregarlo a / src hace eso aparentemente)
Me encontré en un problema similar. Como uso maven, necesitaba actualizar mi pom.xml para incluir algo como esto:
...
</dependencies>
<build>
<resources>
<resource>
<directory>/src/main/resources</directory>
</resource>
<resource>
<directory>../src/main/resources</directory>
</resource>
</resources>
<pluginManagement>
...
Tenga en cuenta la etiqueta del recurso allí para especificar dónde está esa carpeta. Si ha anidado proyectos (como yo), puede que desee obtener recursos de otras áreas en lugar de solo en el módulo en el que está trabajando. Esto ayuda a reducir el mantenimiento del mismo archivo en cada repositorio si está utilizando datos de configuración similares.
No sé si de ayuda, pero en mi caso tenía mi recurso en la carpeta / src / y recibía este error. Luego moví la imagen a la carpeta bin y solucionó el problema.
No utilice rutas absolutas, haga que sean relativas al directorio ''recursos'' en su proyecto. Código rápido y sucio que muestra los contenidos de MyTest.txt desde el directorio ''recursos''.
@Test
public void testDefaultResource() {
// can we see default resources
BufferedInputStream result = (BufferedInputStream)
Config.class.getClassLoader().getResourceAsStream("MyTest.txt");
byte [] b = new byte[256];
int val = 0;
String txt = null;
do {
try {
val = result.read(b);
if (val > 0) {
txt += new String(b, 0, val);
}
} catch (IOException e) {
e.printStackTrace();
}
} while (val > -1);
System.out.println(txt);
}
Parece que hay un problema con el ClassLoader que está utilizando. Usa el contextClassLoader para cargar la clase. Esto es independientemente de si está en un método estático / no estático
Thread.currentThread().getContextClassLoader().getResourceAsStream
......
Lifepaths.class.getClass().getResourceAsStream(...)
carga recursos usando el cargador de clases del sistema, obviamente falla porque no ve sus JAR
Lifepaths.class.getResourceAsStream(...)
carga recursos usando el mismo cargador de clases que cargó la clase Lifepaths y debería tener acceso a recursos en sus JARs