2010-05-26 28 views

risposta

11

Per questo è possibile utilizzare CodeSource#getLocation(). Il CodeSource è disponibile per ProtectionDomain#getCodeSource(). Il ProtectionDomain a sua volta è disponibile per Class#getProtectionDomain().

URL location = getClass().getProtectionDomain().getCodeSource().getLocation(); 
File file = new File(location.getPath()); 
// ... 

Questa operazione riporta la posizione esatta del Class in questione.

Aggiornamento: come da commenti, è apparentemente già nel classpath. È quindi possibile utilizzare semplicemente ClassLoader#getResource() in cui si passa il percorso relativo al pacchetto radice.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL resource = classLoader.getResource("filename.ext"); 
File file = new File(resource.getPath()); 
// ... 

È possibile anche ottenere come un InputStream utilizzando ClassLoader#getResourceAsStream().

InputStream input = classLoader.getResourceAsStream("filename.ext"); 
// ... 

Questo è anche il modo normale di utilizzare le risorse pacchettizzate. Se si trova all'interno di un pacchetto, utilizzare invece, ad esempio, com/example/filename.ext.

+1

+1, ma nota che P rotectionDomain.getCodeSource() e CodeSource.getLocation() possono essere entrambi nulli. –

+0

@bkail: Può effettivamente restituire null quando viene caricato utilizzando un programma di caricamento di classe homegrown mal progettato, oppure quando viene caricato da una fonte di flusso esterna, ecc. Ciò tuttavia, di solito non si applica ai programmi Java "concreti" con un 'main() '. – BalusC

+0

Questo sicuramente fa il lavoro - ma non sembra molto bello. Quello che devo fare è caricare un file di configurazione che deve essere nella stessa cartella del mio barattolo, ma può essere eseguito da qualsiasi posizione. È questo il modo giusto per ottenere le informazioni sulla posizione del file? – markovuksanovic

-1

se si vuole ottenere il "directory di lavoro" per il programma attualmente in esecuzione, poi basta usare:

new File(""); 
+2

La directory di lavoro non è necessariamente dove si trova il programma. – Douglas

Problemi correlati