2010-09-16 16 views
11

Ho bisogno di leggere un file nel mio codice. Esso risiede fisicamente qui:Come faccio a fare riferimento a una risorsa in Java?

C:\eclipseWorkspace\ProjectA\src\com\company\somePackage\MyFile.txt 

ho messo in un pacchetto sorgente in modo che quando creo un file eseguibile jar (Esporta-> file JAR Runnable) che viene incluso nel vaso. Originariamente l'avevo nella root del progetto (e ho anche provato una normale sottocartella), ma l'esportazione non lo includeva nel jar.

Se nel mio codice che faccio:

File myFile = new File("com\\company\\somePackage\\MyFile.txt"); 

il file jar individua correttamente il file, ma in esecuzione a livello locale (Run As-> Java principale applicazione) getta un file non trovato un'eccezione perché si aspetta di essere :

File myFile = new File("src\\com\\company\\somePackage\\MyFile.txt"); 

Ma questo non funziona nel mio file jar. Quindi la mia domanda è: come faccio a far funzionare questo concetto sia per l'esecuzione locale che nel mio file jar?

risposta

33

Utilizzare ClassLoader.getResourceAsStream o Class.getResourceAsStream. La differenza principale tra i due è che la versione ClassLoader utilizza sempre un percorso "assoluto" (all'interno del file jar o qualsiasi altra cosa) mentre la versione Class è relativa alla classe stessa, a meno che non si precisi il percorso con /.

Quindi, se si dispone di una classe com.company.somePackage.SomeClass e com.company.other.AnyClass (all'interno dello stesso programma di caricamento classe come risorsa) è possibile utilizzare:

SomeClass.class.getResourceAsStream("MyFile.txt") 

o

AnyClass.class.getClassLoader() 
       .getResourceAsStream("com/company/somePackage/MyFile.txt"); 

o

AnyClass.class.getResourceAsStream("/com/company/somePackage/MyFile.txt"); 
0

Se Ho inserito il file in un file jar, ha funzionato solo se e solo se ho usato

...getResourceAsStream("com/company/somePackage/MyFile.txt") 

Se ho utilizzato un oggetto File, non ha mai funzionato. Ho ottenuto anche l'eccezione FileNotFound. Ora, rimango con l'oggetto InputStream.

Problemi correlati