2010-01-29 20 views
42

Ich erhalte eine URL, die eine lokale Datei findet (die Tatsache, dass ich eine URL erhalte, steht nicht unter meiner Kontrolle). Die URL wird ordnungsgemäß wie in RFC2396 definiert maskiert. Wie kann ich dies in ein Java-File-Objekt umwandeln?Java: Wie bekomme ich eine Datei von einer maskierten URL?

Lustig genug, die Methode URL getFile() gibt einen String, keine Datei zurück.

Ich habe ein Verzeichnis namens "/ tmp/some dir" erstellt (mit einem Leerzeichen zwischen "some" und "dir"), das korrekt von der folgenden URL gefunden wird: "file: /// tmp/einige% 20dir "(Zitate wurden zur besseren Übersicht hinzugefügt).

Wie kann ich diese URL in eine Java-Datei konvertieren?

Um mehr Details über meine Frage zu geben, die folgenden druckt falsch:

URL url = new URL("file:///tmp/some%20dir"); 
File f = new File(url.getFile()); 
System.out.println("Does dir exist? " + f.exists()); 

Während die folgende druckt true (manuell "% 20" mit einem Leerzeichen ersetzen):

URL url = new URL("file:///tmp/some%20dir"); 
File f = new File(url.getFile().replaceAll("%20", " ")); 
System.out.println("Does dir exist? " + f.exists()); 

Beachten Sie, dass Ich frage nicht warum das erste Beispiel druckt falsch noch warum das zweite Beispiel mit meinem Hacky replaceAll Drucke wahr, ich frage ho w eine maskierte URL in ein Java-Dateiobjekt zu konvertieren.

EDIT: Danke an alle, das war fast ein Betrogener, aber nicht genau.

Dummerweise suchte ich nach einer Hilfsmethode innerhalb der URL-Klasse selbst.

Die folgenden Arbeiten wie erwartet eine Java-Datei aus einer Java-URL zu erhalten: arbeiten

URL url = new URL("file:///home/nonet/some%20dir"); 
File f = new File(URLDecoder.decode(url.getFile(), "UTF-8")); 
+0

Siehe auch http://weblogs.java.net/blog/kohsuke/archive/2007/04/how_to_convert.html für einen Vorbehalt. – Vadzim

Antwort

19
URLDecoder.decode(url);//deprecated 
URLDecoder.decode(url, "UTF-8"); //use this instead 

Siehe ähnliche Frage How do you unescape URLs in Java?

+0

Diese Methode ist veraltet. Verwenden Sie diese stattdessen http://stackoverflow.com/questions/213506/java-net-urlencoder-encodestring-is-deprecated-what-should-i-use- statt –

+2

Wenn die URL RFC2396-codiert ist (zB kam es von 'file.toURI()' oder 'new URI (" Datei ", null, file.getPath(), null)'), dann ** nicht ** dekodieren sie mit [URLDecoder] (http://docs.oracle .com/javase/7/docs/api/java/net/URLDecoder.html)! Wenn die Datei beispielsweise "' main.C++ '" wäre, würde URLDecoder sie als "' main.c '" dekodieren. URLDecoder wird nur zum Entschlüsseln von HTML-Formulareinreichungen verwendet. Dies wird am Ende der [URL javadoc] (http://docs.oracle.com/javase/7/docs/api/java/net/URL.html) erwähnt. – yonran

64

Die File constructor taking an URI in Kombination mit URL#toURI() sollte:

URL url = getItSomehow(); 
File file = new File(url.toURI()); 
+1

+1, das ist ausgezeichnet. – SyntaxT3rr0r

+0

Gern geschehen. Warum wird das dann nicht akzeptiert? : o – BalusC

+0

Nun ... Sie haben nur den Teil über das Abrufen der Datei von der URL beantwortet. Aber hey, es ist die Entscheidung des OP, für welche Antwort er * am meisten * hilfreich ist. –

Verwandte Themen