2010-01-29 8 views
42

Je reçois une URL qui localise un fichier local (le fait que je reçois une URL n'est pas sous mon contrôle). L'URL est échappée valablement comme défini dans RFC2396. Comment puis-je transformer ceci en un objet Java File? Bizarrement, la méthode URL getFile() renvoie une chaîne, pas un fichier.Java: comment obtenir un fichier à partir d'une URL échappée?

J'ai créé un répertoire appelé "/ tmp/un répertoire" (avec un caractère d'espacement entre "un" et "dir"), qui est correctement localisé par l'URL suivante: "file: /// tmp/certains% 20dir "(citations ajoutées pour plus de clarté). Comment puis-je convertir cette URL en un fichier Java?

Pour donner plus de détails au sujet de ma question, les impressions suivantes faux:

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

Bien que les éléments suivants (en remplacement de la main "% 20" avec un espace) imprime vrai:

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

Notez que Je ne demande pas pourquoi le premier exemple imprime faux ni pourquoi le deuxième exemple en utilisant mon hacky remplacerTous imprime vrai, je demande ho w pour convertir une URL échappée en un objet Fichier Java.

EDIT: merci à tous, c'était presque une dupe mais pas exactement. Sincèrement, je cherchais une méthode d'aide dans la classe d'URL elle-même.

Les travaux suivants comme prévu pour obtenir un fichier Java à partir d'une URL Java:

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

Voir aussi http://weblogs.java.net/blog/kohsuke/archive/2007/04/how_to_convert.html pour une mise en garde. – Vadzim

Répondre

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

Voir question connexe How do you unescape URLs in Java?

+0

Cette méthode est obsolète. Utilisez celui-ci à la place http://stackoverflow.com/questions/213506/java-net-urlencoder-encodestring-is-deprecated-what-should-i-use-instead –

+2

Si l'URL est codée RFC2396 (par exemple, elle provient de 'file.toURI()' ou 'new URI (" fichier ", null, file.getPath(), null)'), puis ** ne le décode pas en utilisant [URLDecoder] (http://docs.oracle .com/javase/7/docs/api/java/net/URLDecoder.html)! Par exemple, si le fichier était "main.C++", alors URLDecoder le décoderait comme "' main.c '". URLDecoder est uniquement utilisé pour décoder les soumissions de formulaires HTML. Ceci est mentionné au bas de [URL javadoc] (http://docs.oracle.com/javase/7/docs/api/java/net/URL.html). – yonran

64

La File constructor taking an URI en combinaison avec URL#toURI() devrait fonctionner:

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

+1, c'est excellent. – SyntaxT3rr0r

+0

De rien. Pourquoi cela n'est-il pas accepté en passant? : o – BalusC

+0

Eh bien ... vous avez seulement répondu à la partie sur l'obtention du fichier de l'URL. Mais bon, c'est le choix de l'OP quant à la réponse qu'il pense être la plus * utile *. –

Questions connexes