2010-07-16 8 views
21

Ich habe folgende Zeilen Code.sysLoader.getResource() Problem in Java

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

Es gibt ein seltsames Problem. Wenn ich dies von einem Pfad aus führe, wo im Pfad kein Platz ist (Ordnernamen), läuft es gut. Aber wenn der Pfad irgendwelche Leerzeichen enthält (Zeile "c: \ New Foler ..."), dann funktioniert es nicht.

Wie löst man das?

EDIT: Ausführlicher - Ich inspiziert das Objekt sysloader.

SYSLOADER -> UCP -> Pfad

einen Pfad mit Zeichen% 20 statt Raum

Und deshalb alle URLs sind, ist mit null.

Wie löst man das?

+0

Definieren Sie "nicht funktioniert". Gibt es 'null' zurück? Oder funktioniert die zurückgegebene URL nicht in einem bestimmten Kontext? –

+0

Es gibt NULL in URL zurück – Vishal

Antwort

31

Das von Sun/Oracle bekannt ist, ist ihr Rat URI Objekte zu verwenden, die die% 20 Zeichen werden entfernen:

Statt dies zu tun:

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

Sie jede erzwingen

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

Hier ist der entsprechende aber Bericht markiert als "wird nicht behoben": http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4466485. Dieser Fehler/diese Funktion existiert noch in Java 1.7. – asmaier

+5

Eine kürzere Version ohne explizite Umwandlung in String und zurück zu URI wäre: 'URI uri = url.toURI();' 'FileInputStream fis = neuer FileInputStream (uri.getPath());' – Thomas

0

die URL zu gelangen:% -escaped Zeichen, indem zuerst die URL zu einem URI, und dann die Pfadkomponente des URI als Dateinamen verwenden, werden dekodiert

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

Nach Javadocs ist file.toURL()deprecated:

entkommt Diese Methode Zeichen nicht automatisch, dass die Datei aus Zeichenfolge, wenn der Pfad Leerzeichen enthält, das, was für mich gearbeitet ist sind illegal in URLs. Es wird empfohlen, dass ein neuer Code einen abstrakten Pfadnamen in eine URL umwandelt, indem er ihn zunächst mithilfe der toURI-Methode in einen URI konvertiert und dann den URI mithilfe der URI.toURL-Methode in eine URL umwandelt.

Daher verwendet file.toURI().toURL().

Für Java 7+, ist dies Ansatz statt genommen werden:

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

Hinweis: Wenn der Pfad mit einem / beginnt es anders als relativen Pfad genommen absoluten betrachtet wird.