Me gustaría saber la mejor forma de cargar un recurso en Java:
this.getClass().getResource() (or getResourceAsStream())
,Thread.currentThread().getContextClassLoader().getResource(name)
,System.class.getResource(name)
.
Trabaja la solución de acuerdo a lo que quieras ...
Hay dos cosas que getResource
/ getResourceAsStream()
se obtiene de la clase que se llama en ...
Así que si lo haces
this.getClass().getResource("foo.txt");
intentará cargar foo.txt desde el mismo paquete que la clase "this" y con el cargador de clases de la clase "this". Si coloca una "/" al principio, está haciendo referencia absoluta al recurso.
this.getClass().getResource("/x/y/z/foo.txt")
cargará el recurso desde el cargador de clases de "this" y desde el paquete xyz (deberá estar en el mismo directorio que las clases en ese paquete).
Thread.currentThread().getContextClassLoader().getResource(name)
se cargará con el cargador de clases de contexto pero no resolverá el nombre de acuerdo con ningún paquete (debe estar absolutamente referenciado)
System.class.getResource(name)
Cargará el recurso con el cargador de clases del sistema (también tendría que estar absolutamente referenciado, ya que no podrá poner nada en el paquete java.lang (el paquete de System).
Solo eche un vistazo a la fuente. También indica que getResourceAsStream solo llama a "openStream" en la URL devuelta por getResource y lo devuelve.
Thread#setContextClassLoader
. Esto es útil si necesita modificar la ruta de clases mientras se ejecuta el programa.Bueno, depende en parte de lo que quieras que suceda si realmente estás en una clase derivada.
Por ejemplo, supongamos que
SuperClass
está en A.jar ySubClass
está en B.jar, y está ejecutando código en un método de instancia declarado enSuperClass
pero donde sethis
refiere a una instancia deSubClass
. Si lo usathis.getClass().getResource()
, se verá relativo aSubClass
, en B.jar. Sospecho que normalmente eso no es lo que se requiere.Personalmente, probablemente lo usaría con
Foo.class.getResourceAsStream(name)
más frecuencia: si ya conoce el nombre del recurso que está buscando y está seguro de dónde está en relaciónFoo
, esa es la forma más sólida de hacerlo, en mi opinión.Por supuesto, hay ocasiones en las que eso no es lo que quieres también: juzga cada caso por sus méritos. Es simplemente el "Sé que este recurso está incluido con esta clase" es el más común con el que me he encontrado.
fuente
this.getClass()
. Cree una instancia de la subclase y llame al método ... imprimirá el nombre de la subclase, no la superclase.Busco tres lugares como se muestra a continuación. Comentarios bienvenidos.
fuente
Sé que es muy tarde para otra respuesta, pero solo quería compartir lo que me ayudó al final. También cargará recursos / archivos desde la ruta absoluta del sistema de archivos (no solo la ruta de clases).
fuente
Probé muchas formas y funciones que se sugirieron anteriormente, pero no funcionaron en mi proyecto. De todos modos he encontrado una solución y aquí está:
fuente
this.getClass().getResourceAsStream()
en este caso. Si echa un vistazo a la fuente delgetResourceAsStream
método, notará que hace lo mismo que usted, pero de una manera más inteligente (alternativa si noClassLoader
se puede encontrar en la clase). También indica que puede encontrarse con un potencialnull
engetClassLoader
su código ...this.getClass().getResourceAsStream()
no me funciona, así que lo uso. Creo que hay algunas personas que pueden afrontar un problema como el mío.