Calcular la solución de acuerdo a lo que quiere ...
Hay dos cosas que getResource
/getResourceAsStream()
se obtiene de la clase que se llama en ...
- El cargador de clases
- La ubicación inicial
Así que si lo hace
this.getClass().getResource("foo.txt");
intentará cargar foo.txt desde el mismo paquete que la clase "this" y con el cargador de clase de la clase "this". Si coloca un "/" al frente, entonces está haciendo referencia absoluta al recurso.
this.getClass().getResource("/x/y/z/foo.txt")
cargará el recurso desde el cargador de clases de "este" y desde el paquete x.y.z (que tendrá que estar en el mismo directorio que las clases del paquete).
Thread.currentThread().getContextClassLoader().getResource(name)
se carga con el cargador de clases de contexto, pero no va a resolver el nombre de acuerdo a cualquier paquete (se debe hacer referencia absoluta)
System.class.getResource(name)
cargará el recurso con el cargador de clases del sistema (que sería tiene que ser referenciada absolutamente también, ya que no podrá poner nada en el paquete java.lang (el paquete de Sistema).
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.
Los nombres de los paquetes AFAIK no importan, es el classpath del cargador de clases que sí lo es. –
@Bart si observa el código fuente, notará que el nombre de la clase sí importa cuando llama a getResource en una clase. Lo primero que hace esta llamada es llamar a "resolveName", que agrega el prefijo del paquete, si corresponde. Javadoc for resolveName es "Agregar un prefijo de nombre de paquete si el nombre no es absoluto. Eliminar el encabezado"/"si el nombre es absoluto" –
Ah, ya veo. Absoluto aquí significa relativo a la ruta de clase, en lugar del sistema de archivos absoluto. –