Je suis sur Java 6 et j'ai une méthode qui analyse le chemin de classe d'exécution pour un fichier appelé config.xml
. S'il est trouvé, je voudrais lire le contenu du fichier dans une chaîne:
InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");
if(istream != null) {
System.out.println("Found config.xml!");
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(fileName));
char[] buf = new char[1024];
int numRead = 0;
while((numRead=reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
reader.close();
}
} catch (FileNotFoundException fnfExc) {
throw new RuntimeException("FileNotFoundException: " + fnfExc.getMessage());
} catch (IOException ioExc) {
throw new RuntimeException("IOException: " + ioExc.getMessage());
}
}
Lorsque j'exécute ce code, j'obtiens la sortie de console suivante:
Found config.xml!
Exception in thread "main" Java.lang.RuntimeException: FileNotFoundException: config.xml (No such file or directory)
at com.me.myapp.Configurator.readConfigFileFromClasspath(Configurator.Java:556)
at com.me.myapp.Configurator.<init>(Configurator.Java:34)
...rest of stack trace omitted for brevity
Ainsi, le chemin d'accès aux classes recherche config.xml
réussit, mais le lecteur ne semble pas trouver le fichier. Pourquoi ??? Ma seule théorie est que lorsque config.xml
se trouve sur le chemin de classe, il ne contient pas de chemin absolu vers l'emplacement du fichier sur le système de fichiers, et c'est peut-être ce que le code du lecteur recherche.
D'après votre exemple donné, il n'est pas clair à quoi fileName
fait référence. Vous devez simplement utiliser le flux que vous avez obtenu de getResourceAsStream()
pour lire votre fichier, quelque chose le long
reader = new BufferedReader(new InputStreamReader(istream));
Et vous devez éviter d'allouer à plusieurs reprises buf
new à chaque cycle de lecture, une fois suffit.
Vous utilisez une ressource à partir d'un chargeur de classe.
Au lieu de faire:
InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");
faire:
URL url = getClass().getResource("config.xml");
Cette URL aura le chemin (utilisez .toURI().getPath()
). Pour ouvrir le flux d'entrée correspondant par la suite, utilisez .openStream()
.
Vous savez au moins que la ressource existe: si ce n'est pas le cas, .getResource{,AsStream}()
les deux retournent null
(au lieu de lancer une IOException, ce qui est douteux à mon humble avis)