2010-02-18 11 views
12

Sono un po 'bloccato su un progetto su cui sto lavorando dove voglio caricare un file di testo da un'altra cartella. Sto usando Netbeans e ho, per gli scopi di questo problema, due cartelle, una con la mia classe e una con la risorsa.Problemi nell'uso di Class.getResourceAsStream() in Java

La classe è in ../misc/[ClassName] e il file di testo che voglio caricare è in ../resources/[Name].txt

questo suona incredibilmente semplice, e dopo aver fatto Java per un bel po 'mi dovrebbe sapere questo, ho assunto il miglior modo di caricare questo file piuttosto che utilizzare un semplice FileReader, sarebbe quella di utilizzare getResourceAsStream, come indicato:

InputStream is = 
     this.getClass().getClassLoader().getResourceAsStream(_filename + ".txt"); 

Idealmente risparmiando tempo e non dover hardcode in un filep ath. Ora, il mio problema è che continuo a ricevere sempre il reso nullo dal codice precedente, e in effetti qualsiasi altra permutazione che posso mettere su di esso. Ho provato /resource/filename.txt o resource/filename.txt come parametri, usando .getClass().getResourceAsStream in contrasto con getClassLoader(), tutto sta ancora restituendo lo stesso risultato.

Giusto per evitare qualsiasi confusione, ho controllato il nome del file e il suo sicuramente giusto e nel caso giusto ecc., Quindi non è questo il problema. Qualche idea? So che potrei semplicemente usare lo FileReader per raggiungere lo stesso obiettivo, ma il suo tipo di principio adesso!

risposta

4

Da dove inizia il percorso di classe? Inizia da misc o ..?

Puoi pubblicare il valore di this.getClass().getName()?

Se restituisce misc.ClassName, è necessario utilizzare this.getClass().getResourceAsStream("/resources/filename.txt").

+0

Sì, l'eliminazione di 'getClassLoader()' dovrebbe risolverlo. Almeno, ha fatto per me: 'getClass(). GetResourceAsStream (" ../ resources/filename.txt ")' – Ash

+0

@Ash: questo non fa differenza. 'Cls.getResourceAsStream()' è solo una scorciatoia per 'cls.getClassLoader(). GetResourceAsStream()'. – BalusC

+1

@BalusC: ha fatto tutta la differenza in un'app di prova che ho scritto cercando di replicare il problema. Con l'extra "getClassLoader()" restituiva null, senza che restituisse il flusso (o l'URL per 'getResource()'). – Ash

13

La classe è apparentemente caricata da un altro classloader che non conosce affatto la risorsa. Piuttosto, usa invece il ClassLoader del contesto ottenuto dall'attuale Thread. Sa tutto.

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(_filename + ".txt"); 
7

Io uso IntelliJ e hanno trovato una comune "Gotcha" per me è dimenticare di definire il modello di risorsa appropriata per includere i file .txt, file css, ecc Ciò significa che quando il processo di compilazione viene eseguito lo farà escludi questi file dal file jar che crea, causando chiamate a getResource() per restituire null.

Ho il sospetto che una cosa simile potrebbe succedere con il tuo ambiente Netbeans, quindi potrebbe valerne la pena.

+0

gosh, perché non aggiungono i file .txt per impostazione predefinita ... questo mi ha salvato un'ora – somid3

5

Ho avuto lo stesso problema di David Meadows,
che ha funzionato dal 2008 e nessun problema. Leggi tutto il post relativo a getResourceAsStream() qui. Il mio problema è che posso leggere alcuni dei file dal file jar. Tutto il file png può essere letto, ma i file wav no. La cosa strana è se rinominare il file .wav in .png. I file possono essere caricati e riprodotti!

Quando distribuisco l'applicazione funziona, potrebbe essere IntelliJ in qualche modo?

Nota: So che il file .wav C'è Allucinante la sua possibile raggiungere con JarFile e JarEntry.

Soluzione in intelliJ: Nelle impostazioni del progetto, aggiungere la cartella con i file di risorse, nel mio caso i file audio, come origine. Aggiungere

? *. Wav (o il vostro tipo di file pref)

in Impostazioni-> modelli compilatore di risorse.

Problemi correlati