2013-04-16 18 views
6

Voglio solo leggere un file nel mio programma. Il file si trova una directory sopra la directory di lavoro in "../f.fsh". Così il seguente codice viene eseguito correttamente quando l'eseguo nell'IDEPerché getResourceAsStream() funziona nell'IDE ma non nel JAR?

String name="../f.fsh"; 
InputStream is = getClass().getResourceAsStream(name); 
InputStreamReader isreader=new InputStreamReader(is);//CRASHES HERE WITH NULL POINTER EXCEPTION 
BufferedReader br = new BufferedReader(isreader); 

ma quando creo un file JAR che ha f.fsh zip all'interno di esso ed eseguirlo, si blocca durante la creazione del InputStreamReader, perché l'InputStream è zero.

Ho letto un sacco di risposte alle domande sui flussi di input e sui file JAR e quello che ho ottenuto è che dovrei usare percorsi relativi, ma lo sto già facendo. Da quanto ho capito getResourceAsStream() può trovare i file relativi alla radice del progetto, questo è quello che voglio. Perché non funziona in JAR? Cosa non va, come posso risolverlo?

Ha a che fare con il classpath? Pensavo che fosse solo per includere i file esterni al jar in esecuzione.

Ho anche provato, ma ancora non riescono, quando mette una barra in:

InputStream is = getClass().getResourceAsStream("\\"+name); 

ho guardato: How to get a path to a resource in a Java JAR file andfound che il contenuto di un barattolo possono non necesarily essere accessibile come file. Così l'ho provato con la copia del file relativo al jar (una directory dal jar), e ciò non riesce ancora. In ogni caso mi piacerebbe lasciare i miei file nel barattolo ed essere in grado di leggerli lì. Non so cosa stia sbagliando.

risposta

3

Se .. funziona in Class.getResourceAsStream() durante l'esecuzione da Eclipse, si tratta di un bug in Eclipse. Eclipse e altri IDE implementano caricatori di classi personalizzati per recuperare le risorse dal progetto in fase di runtime. Sembra che l'implementazione del programma di caricamento classi in Eclipse non stia eseguendo tutte le convalide necessarie sull'input al metodo getResourceAsStream(). In questo caso il bug è a tuo favore, ma dovrai comunque ripensare a come strutturare le risorse affinché il tuo codice funzioni in tutti i casi.

+0

Grazie, ha senso. Ho cambiato i miei percorsi di file e dove si trovano le mie risorse ed è stato in grado di superare questo errore nel vaso. Non avrei mai pensato che Eclipse avesse un bug in mio favore. Grazie mille! – AAB

8

Non è possibile utilizzare .. con Class.getResourceAsStream().

Per caricare una risorsa f.fsh nello stesso pacchetto della classe, utilizzare SomeClass.class.getResourceAsStream("f.fsh")

Per caricare una risorsa f.fsh in una sotto-pacchetto foo.bar del pacchetto di classe, utilizzare SomeClass.class.getResourceAsStream("foo/bar/f.fsh")

Per caricare una risorsa f.fsh in qualsiasi pacchetto com.company.foo.bar, utilizzare SomeClass.class.getResourceAsStream("/com/company/foo/bar/f.fsh")

Questo è descritto nel javadoc del metodo getResource(), anche se manca esempi.

+0

Grazie per la risposta, vedo cosa stai dicendo sull'aggiunta di una barra o meno all'inizio. Non funziona con ".."? Sembra di capire il ".." quando lo eseguo da Eclipse. Ma non è compatibile con il barattolo? Sai perché è? – AAB

+1

Sono persino sorpreso che funzioni quando viene usato da un barattolo. La javadoc non consente ... di essere usato. È solo come è progettato. –

+0

Ho appena sperimentato lo stesso problema. La mia ipotesi sarebbe che quando si esegue da file di classe su disco l'argomento viene semplicemente inviato (leggermente analizzato) a una funzione del sistema operativo, pertanto funziona anche se non segue il protocollo. Questo è stato testato con SE6 btw. – user

Problemi correlati