2010-07-16 16 views
21

Sto avendo seguenti linee di codice.sysLoader.getResource() problema in java

sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader(); 
url = sysLoader.getResource("tempFile.txt"); 

Sta dando un problema strano. Se eseguo questo da un percorso in cui non vi è spazio nel percorso (nomi delle cartelle), quindi sta funzionando bene. Ma se il percorso contiene spazi (riga "c: \ New Foler ..."), allora non funziona.

Come risolvere questo?

MODIFICA: in modo più dettagliato, ho ispezionato l'oggetto sysloader.

sysloader -> UCP -> percorso

sta avendo un percorso con carattere% 20 invece di spazio

e quindi tutti gli URL sono nulli.

Come risolvere questo?

+0

Definire "non funzionante". Restituisce 'null'? O l'URL restituito non funziona in qualche contesto? –

+0

Restituisce NULL nell'URL – Vishal

risposta

31

Questo è noto da Sun/Oracle, il loro consiglio è quello di utilizzare gli oggetti URI che rimuoverà il% 20 caratteri:

invece di fare questo:

FileInputStream fis = new FileInputStream(url.getFile()); 

è possibile forzare qualsiasi % caratteri -escaped da decodificare convertendo prima l'URL di un URI, e quindi utilizzare il componente del percorso del URI come il nome del file:

URI uri = new URI(url.toString()); 
FileInputStream fis = new FileInputStream(uri.getPath()); 
+1

Questo è il corrispondente ma segnalato come "Non risolvibile": http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4466485. Questo bug/funzionalità esiste ancora in Java 1.7. – asmaier

+5

Una versione più breve senza conversione esplicita in stringa e ritorno in URI sarebbe: 'URI uri = url.toURI();' 'FileInputStream fis = new FileInputStream (uri.getPath());' – Thomas

0

per ottenere l'URL del file da stringa, quando il percorso contiene spazi, questo è ciò che ha funzionato per me:

File file = new File("/Users/work space/tempFile.txt"); 
URL url = file.toURI().toURL(); 

Secondo Javadocs, file.toURL() è deprecated:

Questo metodo non sfugge automaticamente caratteri che sono illegali negli URL. Si consiglia al nuovo codice di convertire un percorso astratto in un URL convertendolo prima in un URI, tramite il metodo toURI e quindi convertendo l'URI in un URL tramite il metodo URI.toURL.

qui utilizzato file.toURI().toURL().

Per Java 7+, questo è l'approccio può essere preso invece:

URL url = Paths.get("/Users/work space/tempFile.txt").toURI().toURL()); 

Nota: se il percorso inizia con una / è considerato in assoluto altro preso come un percorso relativo.