2010-05-07 17 views
8

La salida por defecto de File.toURL() esGenerar URL del archivo

file:/c:/foo/bar 

Estos no parecen funcionar en las ventanas, y necesitan ser cambiado a

file:///c:/foo/bar 

¿El formato de

file:/foo/bar 

funcionan correctamente en Unix (no tengo una máquina Unix para probar) ¿Hay una biblioteca que pueda encargarse de generar una URL desde un archivo que esté en el formato correcto para el entorno actual?

He pensado en utilizar una expresión regular para solucionar el problema, algo así como:

fileUrl.replaceFirst("^file:/", "file:///") 

Sin embargo, esto no es del todo bien, porque va a convertir una URL correcta como:

file:///c:/foo/bar 

a:

file://///c:/foo/bar 

actualización

estoy usando Java 1.4 y en esta versión File.toURL() no es obsoleto y tanto File.toURL().toString() y File.toURI().toString() generar la misma dirección URL (incorrecto) en las ventanas

+3

'file:/c:/foo/bar' sean no va a funcionar en UNIX ... una máquina UNIX no tiene unidad C: – Cristian

+0

De hecho, sólo se puede utilizar rutas de tipo Unix en Windows. Es decir. '/ foo/bar'. La raíz estará en el mismo disco que el directorio de trabajo del programa Java. – BalusC

+0

¿Qué intentas hacer con esta URL en forma de cadena que no funciona? – Yishai

Respuesta

5

está en desuso El método File.toURL() - se recomienda que se use el método toURI() en su lugar. Si usa eso en su lugar, ¿su problema desaparece?


Editar:

entiendo: usted está usando Java 4. Sin embargo, su pregunta no explicó lo que estaba tratando de hacer. Si, como dice en los comentarios, está intentando simplemente leer un archivo, use un FileReader para hacerlo (o un FileInputStream si el archivo es un formato binario).

+3

+1 - ayuda leer los javadocs ... http://java.sun.com/javase/6/docs/api/java/io/File.html#toURL() –

+1

@Don: Asumí que eras usando 1.5 o superior - disculpas. Todavía intentaré usar .toURI(), ya que puede resolver el problema (me parece recordar algunos problemas con .toURL() cuando estaba usando 1.4, pero eso fue hace un tiempo, así que podría estar equivocado) – aperkins

+0

Usando URI en lugar de URL no hace ninguna diferencia en Java 1.4 –

1

¿Qué quiere decir realmente con "¿Funciona correctamente el formato file:/c:/foo/bar en Unix"?

Algunos ejemplos de Unix.

File file = new File("/tmp/foo.txt"); // this file exists 
System.out.println(file.toURI()); // "file:/tmp/foo.txt" 

Sin embargo, no se puede p. hacer esto:

File file = new File("file:/tmp/foo.txt"); 
System.out.println(file.exists()); // false 

(Si necesita una instancia URL, hacer file.toURI().toURL() como el Javadoc says.)

Editar: ¿qué hay de los siguientes, ¿ayuda?

URL url = new URL("file:/tmp/foo.txt"); 
System.out.println(url.getFile()); // "/tmp/foo.txt" 
File file = new File(url.getFile()); 
System.out.println(file.exists()); // true 

(Básicamente muy cerca el ejemplo de BalusC que se usa new File(url.toURI()).)

+1

@ Don, si esto no es útil en absoluto, ¿puede explicar qué quería decir con que el formato funciona correctamente? – Jonik

+0

Usar URI en lugar de URL no hace ninguna diferencia en Java 1.4 –

+2

Derecha. Pero para poder responder a su pregunta, ¿qué está tratando de hacer realmente? Es decir, ¿cómo piensa utilizar el formato 'file:/foo/bar' en el código en Unix? – Jonik

12

El File(String) espera una ruta de acceso, no una URL.Si quiere construir un File basado en un String que en realidad represente una URL, necesitará convertir este String de nuevo a URL primero y utilizar File(URI) para construir el File basado en URL#toURI().

String urlAsString = "file:/c:/foo/bar"; 
URL url = new URL(urlAsString); 
File file = new File(url.toURI()); 

Actualización: ya que estás en Java 1.4 y URL#toURI() es en realidad un método Java 1.5 (lo siento, que se pasa por alto bits), mejor usar URL#getPath() vez que devuelve la ruta de acceso, por lo que se puede utilizar File(String).

String urlAsString = "file:/c:/foo/bar"; 
URL url = new URL(urlAsString); 
File file = new File(url.getPath());