45 votes

Java : comment obtenir un fichier à partir d'une URL échappée ?

Je reçois une URL qui localise un fichier local (le fait que je reçoive une URL n'est pas sous mon contrôle). L'URL est échappée de manière valide comme défini dans la RFC2396. Comment puis-je la transformer en un objet Java File ?

Il est amusant de constater que la méthode URL getFile() renvoie une chaîne, et non un fichier.

J'ai créé un répertoire appelé "/tmp/some dir" (avec un caractère d'espacement entre "some" et "dir"), qui est correctement localisé par l'URL suivante : "file:///tmp/some%20dir" (les guillemets ont été ajoutés pour plus de clarté).

Comment puis-je convertir cette URL en un fichier Java ?

Pour donner plus de détails sur mon problème, les impressions suivantes sont fausses :

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

Alors que l'exemple suivant (en remplaçant manuellement "%20" par un espace) affiche 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 n'imprime ni faux ni pourquoi le deuxième exemple utilisant mon bricolage replaceAll C'est vrai, je demande comment convertir une URL échappée en un objet Java File.

EDIT Merci à tous, c'était presque un double mais pas exactement.

Stupidement, je cherchais une méthode d'aide à l'intérieur de la classe URL elle-même.

Ce qui suit fonctionne 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" ) );

66voto

BalusC Points 498232

En File qui prend un URI en combinaison avec URL#toURI() devrait fonctionner :

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

20voto

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

Voir la question connexe Comment désempiler les URL en Java ?

7voto

vorburger Points 679

AFAIK comme ceci Paths.get(url.toURI()).toFile() est la meilleure solution, à partir de Java 7. Voir aussi Conversion de l'URL Java file:// en chemin File(...), indépendamment de la plate-forme, y compris les chemins UNC .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X