2010-05-07 5 views
8

La sortie par défaut de File.toURL() estGenerate URL pour le fichier

file:/c:/foo/bar 

Ceux-ci ne semblent pas travailler sur les fenêtres, et doivent être changées pour

file:///c:/foo/bar 

Est-ce que le format

file:/foo/bar 

fonctionne correctement sur Unix (je n'ai pas de machine Unix à tester)? Existe-t-il une bibliothèque pouvant prendre en charge la génération d'une URL à partir d'un fichier au format correct pour l'environnement actuel?

J'ai pensé à utiliser une expression rationnelle pour résoudre le problème, quelque chose comme:

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

Cependant, ce n'est pas tout à fait raison, car il permet de convertir une URL correcte comme:

file:///c:/foo/bar 

à:

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

Mise à jour

J'utilise Java 1.4 et dans cette version File.toURL() n'est pas dépréciée et les deux File.toURL().toString() et File.toURI().toString() générer la même URL (incorrect) sur les fenêtres

+3

'file:/c:/toto/bar' ne fonctionnera pas sous UNIX ... une machine UNIX ne pas C: drive – Cristian

+0

En effet, vous pouvez simplement utiliser des chemins unix-comme dans Windows. C'est à dire. '/ foo/bar'. La racine sera sur le même disque que le répertoire de travail du programme Java. – BalusC

+0

Qu'est-ce que vous essayez de faire avec cette URL sous forme de chaîne qui ne fonctionne pas? – Yishai

Répondre

5

La méthode File.toURL() est dépréciée - il est recommandé que vous utilisez plutôt la méthode toURI(). Si vous l'utilisez à la place, votre problème disparaît-il?


Edit:

Je comprends: vous utilisez Java 4. Toutefois, votre question n'a pas expliqué ce que vous essayez de faire. Si, comme vous le dites dans les commentaires, vous tentez simplement de lire un fichier, utilisez un FileReader pour le faire (ou un FileInputStream si le fichier est au format binaire).

+3

+1 - il aide à lire les javadocs ... http://java.sun.com/javase/6/docs/api/java/io/File.html#toURL() –

+1

@Don: Je supposais que vous étiez en utilisant 1,5 ou plus - des excuses. J'essaierais quand même d'utiliser .toURI(), car cela pourrait résoudre le problème (je me souviens de quelques problèmes avec .toURL() quand j'utilisais 1.4, mais c'était il y a un moment donc je pourrais me tromper) – aperkins

+0

URI au lieu de l'URL ne fait aucune différence dans Java 1.4 –

1

Que voulez-vous dire par "Est-ce que le format file:/c:/foo/bar fonctionne correctement sous Unix"?

Quelques exemples d'Unix.

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

Cependant, vous ne pouvez pas par ex. faire:

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

(Si vous avez besoin d'une instance URL, faire file.toURI().toURL() comme Javadoc says.)

Modifier: Que diriez-vous ce qui suit, est-il utile?

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 

(fond très proche de l'exemple de BalusC qui a utilisé new File(url.toURI()).)

+1

@Don, Si cela n'est pas du tout utile, pouvez-vous préciser ce que vous vouliez dire sur le bon fonctionnement du format? – Jonik

+0

L'utilisation d'URI au lieu d'URL ne fait aucune différence dans Java 1.4 –

+2

Right. Mais pour être en mesure de répondre à votre question, qu'essayez-vous réellement de faire? Par exemple, comment avez-vous l'intention d'utiliser le format 'fichier:/foo/bar' dans le code sous Unix? – Jonik

12

Le File(String) attend un chemin, pas une URL.Si vous voulez construire un File basé sur un String qui représente en fait une URL, alors vous devrez d'abord convertir ce String en URL et utiliser File(URI) pour construire le File basé sur URL#toURI().

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

Mise à jour: puisque vous êtes sur Java 1.4 et URL#toURI() est en fait une méthode Java 1.5 (désolé, perdre de vue que peu), mieux utiliser URL#getPath() à la place qui retourne le chemin, de sorte que vous pouvez utiliser File(String).

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