Originariamente inviato da LeleFT
Giusto per aggiungere un po' di info, spiego come funzionano getResource() e getResourceAsStream() (lo fece già andbin molto tempo fa, ma vedo che comunque si continua a sbagliarne l'uso).
getResource()/getResourceAsStream() funzionano allo stesso identico modo: il primo fornisce un oggetto URL che identifica una risorsa, il secondo fornisce un InputStream per poter leggere la risorsa come stream di byte.
Entrambi usano la stessa tecnica che usa il ClassLoader per scovare le classi: ovvero, usano il CLASSPATH.
La stringa da passare come parametro a getResource()/getResourceAsStream() è un percorso particolare:
1) Se tale percorso è preceduto dal carattere "/", la JVM lo interpreterà come un percorso assoluto rispetto al CLASSPATH.
2) Se tale percorso non è preceduto dal carattere "/", la JVM lo interpreterà come un percorso relativo al package della classe su cui lo si sta invocando.
Facciamo un esempio.
Il mio progetto è così composto:
codice:
uno
|
+ ClasseUno.class
+ Immagine1.png
|
+--- due
| |
+--- + ClasseDue.class
+--- + Immagine2.png
| |
+--- +--- tre
| |
+--- +--- + ClasseTre.class
+--- +--- + Immagine3.png
Chiaramente, le tre classi avranno le seguenti intestazioni:
codice:
package uno;
public class ClasseUno ... {
package uno.due;
public class ClasseDue ... {
package uno.due.tre;
public class ClasseTre ... {
Se io volessi usare l'immagine "Immagine3.png", da qualunque classe del mio progetto posso usare la seguente sintassi:
codice:
ImageIcon img = new ImageIcon( getClass().getResource("/uno/due/tre/Immagine3.png") );
Se, invece, volessi usare un percorso "relativo", allora le cose cambiano:
codice:
// Per usarla da ClasseUno
ImageIcon img = new ImageIcon( getClass().getResource("due/tre/Immagine3.png") );
// Per usarla da ClasseDue
ImageIcon img = new ImageIcon( getClass().getResource("tre/Immagine3.png") );
// Per usarla da ClasseTre
ImageIcon img = new ImageIcon( getClass().getResource("Immagine3.png") );
Se avessi deciso di incapsulare tutte le immagini all'interno di una sottodirectory "resources" (cosa molto comune), il discorso non si sposta di una virgola: la directory "resources" sarebbe esattamente come una parte del package e segue esattamente le stesse regole.
Ciao.