proyecto metodo leer getresourceasstream getclass ejemplo dentro archivo java swing

java - metodo - Cargando recursos usando getClass(). GetResource()



leer archivo dentro de proyecto java (4)

Como noobie, esto me confundió hasta que me di cuenta de que el llamado "camino" es el camino relativo a MyClass. archivo de clase en el sistema de archivos y no el MyClass. archivo java . Mi IDE copia los recursos (como xx.jpg, xx.xml) a un directorio local de MyClass.class. Por ejemplo, dentro de un directorio de pkg llamado "target / classes / pkg. La ubicación del archivo de clase puede ser diferente para diferentes IDE y dependiendo de cómo esté estructurada la compilación para su aplicación. Primero debe explorar el sistema de archivos y encontrar la ubicación de el archivo MyClass.class y la ubicación copiada del recurso asociado que desea extraer. A continuación, determine la ruta relativa al archivo MyClass.class y escríbala como un valor de cadena con "puntos" y "barras diagonales".

Por ejemplo, aquí es cómo hago que un archivo app1.fxml esté disponible para mi aplicación javafx donde la "MyClass.class" relevante sea implícitamente "Main.class". El archivo Main.java es donde se encuentra esta línea de código de llamada de recursos. En mi caso específico, los recursos se copian en una ubicación en el mismo nivel que la carpeta del paquete adjunto. Es decir: /target/classes/pkg/Main.class y /target/classes/app1.fxml. Parafraseando ... la referencia relativa "../app1.fxml" es "comience desde Main.class, suba un nivel de directorio, ahora puede ver el recurso".

FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource("../app1.fxml"));

Tenga en cuenta que en esta cadena de ruta relativa "../app1.fxml", los dos primeros puntos hacen referencia al directorio que contiene Main.class y al único "." Indica una extensión de archivo a seguir. Después de que estos detalles se conviertan en una segunda naturaleza, olvidará por qué fue confuso.

Estoy tratando de cargar una imagen para usarla como icono en mi aplicación. El método apropiado de acuerdo a este tutorial es:

protected ImageIcon createImageIcon(String path, String description) { java.net.URL imgURL = getClass().getResource(path); if (imgURL != null) { return new ImageIcon(imgURL, description); } else { System.err.println("Couldn''t find file: " + path); return null; } }

Entonces, coloqué la ubicación del archivo y lo pasé como un parámetro a esta función. Esto no funcionó, es decir, imgURL era nulo. Cuando intenté crear el ImageIcon pasando la ruta explícitamente:

ImageIcon icon = new ImageIcon(path,"My Icon Image");

¡Funcionó muy bien! Por lo tanto, la aplicación puede recoger la imagen de una ruta definida explícitamente, pero no la tomó con getResources (). En ambos casos, el valor de la variable de ruta es el mismo. ¿Por qué no funcionaría? ¿Cómo se encuentran los recursos por el cargador de clases?

Gracias.


Puedes solicitar una ruta en este formato:

/package/path/to/the/resource.ext

Incluso los bytes para crear las clases en la memoria se encuentran de esta manera:

my.Class -> /my/Class.class

y getResource le dará una URL que se puede usar para recuperar un InputStream .

Pero ... Recomiendo usar directamente getClass().getResourceAsStream(...) con el mismo argumento, porque devuelve directamente InputStream y no tiene que preocuparse por crear un objeto URL (probablemente complejo) que tenga que saber cómo crear el InputStream.

En resumen: intente usar getResourceAsStream y algún constructor de ImageIcon que use un InputStream como argumento.

Cargadores de clases

Ten cuidado si tu aplicación tiene muchos cargadores de clases. Si tiene una aplicación independiente simple (sin servidores o cosas complejas) no debe preocuparse. No creo que sea el caso siempre que ImageIcon fuera capaz de encontrarlo.

Editar: classpath

getResource es, como dice mattb, para cargar recursos desde el classpath (desde su directorio .jar o classpath). Si está empaquetando una aplicación, es bueno tenerla en conjunto, por lo que podría incluir el archivo de ícono dentro del contenedor de su aplicación y obtenerlo de esta manera.


getResource por ejemplo:

package szb.testGetResource; public class TestGetResource { private void testIt() { System.out.println("test1: "+TestGetResource.class.getResource("test.css")); System.out.println("test2: "+getClass().getResource("test.css")); } public static void main(String[] args) { new TestGetResource().testIt(); } }

salida:

test1: file:/home/szb/projects/test/bin/szb/testGetResource/test.css test2: file:/home/szb/projects/test/bin/szb/testGetResource/test.css


getClass().getResource(path) carga recursos desde la ruta de clase, no desde una ruta del sistema de archivos.