2010-01-29 19 views
42

Recibo una URL que localiza un archivo local (el hecho de que reciba una URL no está bajo mi control). La URL se escapó válidamente como se define en RFC2396. ¿Cómo puedo transformar esto en un objeto de archivo Java?Java: ¿cómo obtener un archivo de una URL escapada?

Curiosamente, el método URL getFile() devuelve una Cadena, no un Archivo.

He creado un directorio llamado "/ tmp/some dir" (con un espaciado entre "algunos" y "dir"), que se encuentra correctamente en la siguiente URL: "file: /// tmp/some% 20dir "(se agregaron citas para mayor claridad).

¿Cómo puedo convertir esa URL a un archivo Java?

para dar más detalles acerca de mi problema, las siguientes impresiones falsas:

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

Aunque la siguiente (en sustitución de forma manual "% 20" con un espacio) imprime cierto:

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

Tenga en cuenta que No estoy pidiendo por qué el primer ejemplo imprime falso por qué el segundo ejemplo usando mi hacky replaceAll imprime cierto, estoy preguntando ho w para convertir una URL escapada en un objeto de archivo Java.

EDITAR: gracias de todo, esto era casi una víctima, pero no exactamente.

Estúpidamente estaba buscando un método de ayuda dentro de la propia clase de URL.

Los siguientes trabajos como era de esperar para obtener un archivo Java desde una URL de Java:

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

Consulte también http://weblogs.java.net/blog/kohsuke/archive/2007/04/how_to_convert.html para obtener una advertencia. – Vadzim

Respuesta

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

ver pregunta relacionada How do you unescape URLs in Java?

+0

Este método está en desuso. Use este en su lugar http://stackoverflow.com/questions/213506/java-net-urlencoder-encodestring-is-deprecated-what-should-i-use-instead –

+2

Si la URL está codificada en RFC2396 (por ejemplo, proviene de 'file.toURI()' o 'nuevo URI (" archivo ", nulo, file.getPath(), null)'), luego ** do not ** decodifíquelo usando [URLDecoder] (http://docs.oracle .com/javase/7/docs/api/java/net/URLDecoder.html)! Por ejemplo, si el archivo fuera "' main.C++ '", entonces URLDecoder lo decodificaría como "' main.c '". URLDecoder solo se usa para decodificar envíos de formularios HTML. Esto se menciona en la parte inferior de [URL javadoc] (http://docs.oracle.com/javase/7/docs/api/java/net/URL.html). – yonran

64

El File constructor taking an URI en combinación con URL#toURI() debería funcionar:

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

+1, esto es excelente. – SyntaxT3rr0r

+0

De nada. ¿Por qué no se acepta esto por cierto? : o – BalusC

+0

Bueno ... solo respondió la parte sobre cómo obtener el archivo de la URL. Pero bueno, es la elección de OP en cuanto a qué respuesta cree que es * más * útil. –

Cuestiones relacionadas