web-dev-qa-db-fra.com

Comment obtenir Java Chemin absolu du fichier depuis InputStream?

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.

14
user1768830

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.

2
Gyro Gearless

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)

32
fge