2009-03-11 8 views
4

D'accord, je suis en train de charger un fichier en Java en utilisant ce code:Fichier non trouvé. Pourquoi pas?

String file = "map.mp"; 
URL url = this.getClass().getResource(file); 
System.out.println("url = " + url); 
FileInputStream x = new FileInputStream("" + url); 

et malgré le fichier en cours dans le même dossier que la classe, il dit qu'il ne peut pas trouver (oui, il est dans un bloc try catch dans le code complet).

Cependant, il trouve un autre fichier en utilisant le même code avec un nom différent:

URL url = this.getClass().getResource("default.png"); 
System.out.println("url2 = " + this.getClass().getResource("default.png")); 
BufferedImage img = ImageIO.read(url); 

Pourquoi mon code de trouver mon fichier map.mp?

+1

Sur une note totalement indépendante, url.toString() est beaucoup plus efficace (et plus agréable) que "" + url. –

+0

Devrions-nous supposer qu'il lance une exception FileNotFoundException? – Powerlord

+0

Alors, qu'est-ce qui est imprimé lorsque vous exécutez cela? Je suppose que le problème est que FileInputStream n'aime pas les URL. –

Répondre

18

Vous essayez d'utiliser une URL comme s'il s'agissait d'un nom de fichier. Ce ne sera pas. Ce sera quelque chose qui commence par file://. Dans d'autres scénarios de déploiement, il se peut qu'il n'y ait aucun fichier réel à ouvrir - il peut s'agir d'un fichier jar, par exemple. Vous pouvez utiliser URL.getFile() si vous avez vraiment, vraiment - mais c'est mieux de ne pas le faire.

Utilisez getResourceAsStream au lieu de getResource() - qui vous donne un InputStream directement. Vous pouvez également continuer à utiliser getResource() si vous souhaitez utiliser l'URL pour autre chose, puis utiliser URL.openStream() pour obtenir les données.

+0

Quelle était la raison pour laquelle la première FnFE se termine la seconde pas? – OscarRyz

+0

La seconde utilise ImageIO.read() qui prend une URL. –

4

FileInputStream prend un nom de fichier en tant que paramètre, pas une chaîne d'URL.

La manière habituelle d'obtenir le contenu URL est avec openStream. Vous pouvez ouvrir un flux vers une ressource sans toucher un URL vous-même avec Class/ClassLoader.getResourceAsStream (il ouvre l'URL dans l'implémentation).

Vous pouvez ouvrir fichier URL avec:

InputStream in = FileInputStream(new File(url.toURI())); 

Pour une ressource cela nécessiterait que vous avez des fichiers de classe en dehors premières d'un pot sur votre système de fichiers. JNLP (Java WebStart) a une API pour ouvrir des fichiers de manière sûre.

En général: Lors de la conversion en String, utilisez toString ou String.valueOf pour être clair sur ce que vous faites. Notez également que String est légèrement typé, en ce sens que le type ne donne aucune indication sur le format des données qu'il contient, donc privilégiez les goûts de URI ou File.

+0

Alors, comment puis-je charger un fichier correctement? Cela va dans un Java Web Start Jar. – William

0

Essayez de voir si le fichier auquel vous essayez d'accéder est trouvé ou le fichier voulu. Utilisez Sys internals File Monitor. Il aide à surveiller les fichiers auxquels le responsable de la sécurité a accédé.

0

Avez-vous un espace sur votre chemin? Voyez-vous un% 20? Enlevez ça. Ensuite, cela fonctionnera: getResource (fichier) tout comme getResourceAsStream().

Les espaces sont mauvais dans les chemins. Toujours les éviter.