2009-07-13 12 views
11

Questo problema mi ha disturbato per un po '. Devo caricare un file di coppia nel mio java app, e l'unico modo ho ottenuto lavorando finora assomiglia a questo:Caricamento di file con ClassLoader

URL hsURL; 
if(System.getProperty("os.name").toLowerCase().contains("windows")) { 
    hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs"); 
} 
else { 
    hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs"); 
} 

Ma questo è brutto e terribile. Per un po 'ho pensato che avevo questo lavoro:.

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs"); 

Ma che non funziona più per qualche motivo (devo aver cambiato qualcosa e non se ne è accorto restituisce null

Dovrei usare getResource(). invece di getSystemResource() (in tal caso, perché getSystemResource() statico ma non getResource())?

Sto usando eclipse e ho provato a includere la cartella nel percorso di generazione (classpath) e non includendolo, esso non sembra fare la differenza

risposta

23

getSystemResource è statico perché utilizzerà il system classloader, che è disponibile staticamente. (ClassLoader.getSystemClassLoader)

Se la risorsa è disponibile nel classpath, vi suggerirei di usare ClassLoader.getResource() o Class.getResource da una classe del caso, per esempio

Foo.class.getResource("/helpsets/helpset.hs"); 

(ClassLoader.getResource è "assoluto";. Class.getResource è relativo al pacchetto della classe a meno che non prefisso con un '/')

Se questo non funziona, si prega di inviare la vostra applicazione come è configurato in termini di classpath e dove si trova il tuo file.

MODIFICA: di solito trovo l'URL meno utile di un InputStream, quindi uso getResourceAsStream anziché getResource. YMMV

+0

Darn.Batti un paio di secondi – tddmonkey

+0

Se sei interessato solo ai contenuti, probabilmente stai meglio usando getResourceAsStream() sul ClassLoader –

+0

beh, non ho ancora funzionato. Sto cercando di caricare un file che si trova in un pacchetto diverso come la classe da cui lo sto caricando, quindi ho bisogno di un qualche tipo di riferimento assoluto. – twolfe18

3

Hai menzionato diverse cose qui, quindi cerchiamo di risolverle.

1) Creazione di un "file:" URL sulla base di "user.dir"

La proprietà "user.dir" si riferisce alla directory di lavoro corrente - ovunque l'utente potrebbe essere stato quando s/ha iniziato l'applicazione. È probabile che i file scritti qui spariscano tra due esecuzioni (perché l'utente potrebbe eseguire da una directory diversa).

La proprietà "user.home" fa riferimento alla home directory dell'utente, che dovrebbe rimanere uguale tra le esecuzioni.

In entrambi i casi, utilizzare un oggetto File per aprire i file, non muck around con la creazione di un URL "file:". Non ottieni alcun beneficio e, come puoi vedere, devi scrivere codice disordinato per accedervi.

2) Recupero di una risorsa tramite il programma di caricamento classe

Questo è lo scopo di recuperare file che sono disponibili con l'applicazione - file di sola lettura. Come hai visto, ci sono più varianti. Io preferisco usare il seguente, perché presumo che una classe vorrà caricare un file che è impacchettato con esso.

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);