2013-10-24 15 views
5

Mi sono confuso da getResourceAsStream();Dove getResourceAsStream (file) cerca il file?

mia struttura del pacchetto si presenta come:

\src 
|__ net.floodlightcontroller // invoked getResourceAsStream() here 
|__ ... 
|__ resources 
    |__ floodlightdefault.properties //target 
    |__ ... 

E voglio leggere da floodlightdefault.properties. Ecco il mio codice, che giace nel pacchetto net.floodlightcontroller:

package net.floodlightcontroller.core.module; 
// ... 
InputStream is = this.getClass().getClassLoader() 
       .getResourceAsStream("floodlightdefault.properties"); 

Ma non è riuscito, ottenendo is == null. Quindi mi chiedo come esattamente getResourceAsStream(file) cerchi il file. Voglio dire funziona attraverso determinati PATH s o in un certo ordine?

Se sì, come configurare le posizioni che cerca getResourceAsStream()?

Thx!

+0

Hai aggiunto la directory delle risorse in un classpath durante l'esecuzione del codice? In generale, il comportamento di getResourceAsStream dipende dall'implementazione di ClassLoader. –

+0

In generale dipenderà anche da cosa "questo" si riferisce. – Radiodef

+0

Per risolvere il problema con null, ci sono due cose che vedo inizialmente. Per prima cosa, sembra che tu debba solo cambiare la tua directory in "risorse/floodlightdefault.properties". In secondo luogo, il metodo potrebbe cercare la risorsa all'interno della directory di build e la struttura di directory che hai mostrato sembra essere la cartella di origine del progetto IDE. Anche se ovviamente hai aggiunto le risorse al progetto, l'IDE dovrebbe copiare automaticamente i file nella directory di costruzione. In un test rapido con Netbeans, le mie risorse escono null se le rimuovo da _both_ la build e la cartella src. – Radiodef

risposta

7

Quando si chiama this.getClass().getClassLoader().getResourceAsStream(File), Java cerca il file nella stessa directory della classe indicata da this. Quindi, se la struttura del file è:

\src 
|__ net.floodlightcontroller.core.module 
    |__ Foo.java 
|__ ... 
|__ resources 
    |__ floodlightdefault.properties //target 
    |__ ... 

allora ti consigliamo di chiamare:

InputStream is = Foo.class.getClassLoader() 
      .getResourceAsStream("..\..\..\resources\floodlightdefault.properties"); 

Meglio ancora, cambiare la struttura del pacchetto per assomigliare:

\src 
|__ net.floodlightcontroller.core.module 
    |__ Foo.java 
    |__ floodlightdefault.properties //target 
    |__ ... 

E proprio chiamata call:

InputStream is = Foo.class.getClassLoader() 
      .getResourceAsStream("floodlightdefault.properties"); 
+0

@Jones Grazie, e ho aggiunto 'risorse' al percorso della classe, funziona anche. – qweruiop

Problemi correlati