Agradeceríamos tu apoyo para compartir nuestras reseñas con relación a las ciencias informáticas.
Solución:
Puedes usar getResourceAsStream()
método de java.lang.Class
como lo has hecho tú, pero hay que añadir /
antes del camino.
Esta pregunta es engañosa.
1. Dos métodos con el mismo nombre
En primer lugar, existen dos métodos. del mismo nombre y la misma firma en estas dos clases:
java.lang.Class
java.lang.ClassLoader
Tienen el mismo nombre: getResource(String)
(y getResourceAsStream(String)
es igual).
2. Aceptan params de diferente formato
Entonces, el parámetro de ellos tiene un formato diferente:
- El método
java.lang.Class.getResouce
acepta camino con y sin el líder() /
, dando como resultado diferentes estrategias de búsqueda de recursos. Si un camino no tiene/
Java buscará el recurso en el paquete/carpeta donde se encuentra el.class
reside el archivo. si tiene/
Java comenzará la búsqueda desde la raíz de classpath. -
El método
java.lang.ClassLoader.getResource
acepta solo camino sin() /
, porque siempre busca desde classpath. En una ruta basada en classpath,/
no es un carácter válido. **: Como dice esta respuesta: this.getClass().getClassLoader().getResource(“…”) y NullPointerException
¿Cómo agregar una carpeta a classpath? En Eclipse, resolvemos el menú contextual de un proyecto: “Ruta de compilación” – “Configurar ruta de compilación…” y agregamos alguna carpeta a la ruta de compilación.
3. Cuando se trata de Maven
Por fin, si un proyecto es un proyecto Maven, por defecto src/main/resources
está en el classpath, por lo que podemos usar
Class.getResource("/path-to-your-res");
o,
ClassLoader.getResource("path-to-your-res");
para cargar cualquier cosa debajo src/main/resources
.
Si queremos añadir otra carpeta de recursos, como has comentado, se hace en pom.xml
. Y también se agregan a classpath, hecho por Maven. No se necesita configuración adicional.
4. Ejemplo
Por ejemplo, si su config.ini
está debajo src/main/resources/settings
, myAvatar.gif
por debajo src/main/images
tu puedes hacer:
En pom.xml
:
src/main/images
En codigo:
URL urlConfig = MyClass.class.getResource("/settings/config.ini"); //by default "src/main/resources/" is in classpath and no config needs to be changed.
InputStream inputAvatar = MyClass.class.getResourceAsStream("/myAvatar.gif"); //with changes in pom.xml now "src/main/images" is counted as resource folder, and added to classpath. So we use it directly.
debemos usar /
arriba.
O, con ClassLoader:
URL urlConfig = MyClass.class.getClassLoader().getResource("settings/config.ini"); //no leading "/"!!!
InputStream inputAvatar = MyClass.class.getClassLoader().getResourceAsStream("myAvatar.gif"); //no leading "/"!!!
Creo que encontré la solución. Como escriben Juned Ahsan y mR_fr0g, necesito usar la clase ClassLoader, en lugar de this.getClass().getResource(). Pero, solo funciona para la carpeta de recursos. Pero maven permite agregar otras carpetas como carpetas de recursos. Solo necesitaba agregar esta sección a pom.xml:
src/main/config
Y el código Java de trabajo es:
InputStream image = this.getClass().getClassLoader().getResourceAsStream("images/image.png");
InputStream config = ClassLoader.getSystemResourceAsStream("config.xml");
public Preferences()
InputStream image = this.getClass().getClassLoader().getResourceAsStream("image.png");
InputStream config = this.getClass().getClassLoader().getResourceAsStream("config.xml")
Te mostramos reseñas y calificaciones
Puedes añadir valor a nuestro contenido añadiendo tu veteranía en las observaciones.