414 votes

Comment vraiment lire fichier texte de classpath dans Java

Je suis en train de lire un fichier texte qui est défini dans le CLASSPATH de la variable système. Pas une variable utilisateur.

J'essaie d'obtenir des flux d'entrée dans le fichier comme ci-dessous:

Placer le répertoire de fichier (D:\myDir)dans le CLASSPATH et essayer ci-dessous:

InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");

Lieu chemin d'accès complet du fichier (D:\myDir\SomeTextFile.txt)dans le CLASSPATH et essayer la même chose au-dessus de 3 lignes de code.

Mais malheureusement, AUCUN d'entre eux travaillent et je suis toujours prise en null dans mon InputStream in.

De toute façon, s'il vous plaît? J'ai googlé un lot et aucun des sites web, y compris un Débordement de Pile a toutes les informations fiables sur getResourceAsStream().

Ce qui concerne.

674voto

Jon Skeet Points 692016

Avec l'annuaire sur le chemin de la classe, à partir d'une classe chargée par le même chargeur de classe, vous devriez être en mesure d'utiliser l'un de:

// From ClassLoader, all paths are "absolute" already - there's no context
// from which they could be relative. Therefore you don't need a leading slash.
InputStream in = this.getClass().getClassLoader()
                                .getResourceAsStream("SomeTextFile.txt");
// From Class, the path is relative to the package of the class unless
// you include a leading slash, so if you don't want to use the current
// package, include a slash like this:
InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");

Si ceux qui ne travaillent pas, qui suggère autre chose est erroné.

Par exemple, prenez ce code:

package dummy;

import java.io.*;

public class Test
{
    // This code is nasty and not exception safe. Just demo code!
    public static void main(String[] args) throws Exception
    {
        InputStream stream = Test.class.getResourceAsStream("/SomeTextFile.txt");
        System.out.println(stream != null);
        stream = Test.class.getClassLoader()
            .getResourceAsStream("SomeTextFile.txt");
        System.out.println(stream != null);
    }
}

Et cette structure de répertoire:

code
    dummy
          Test.class
txt
    SomeTextFile.txt

Et ensuite (à l'aide de l'Unix séparateur de chemin que je suis sur une machine Linux):

java -classpath code:txt dummy.Test

Résultats:

true
true

133voto

yawn Points 2823

Lors de l'utilisation de la Spring Framework (comme une collection d'utilitaires ou conteneur - vous n'avez pas besoin d'utiliser la fonctionnalité de ce dernier), vous pouvez facilement utiliser les Ressources de l'abstraction.

Resource resource = new ClassPathResource("com/example/Foo.class");

À travers les Ressources de l'interface, vous pouvez accéder à la ressource comme InputStream, URL, URI ou Fichier. Changer le type de ressource, par exemple un système de fichier de ressources est une simple question de modification de l'instance.

72voto

Peter Perháč Points 8007

C'est ainsi que je lis toutes les lignes d'un fichier texte sur mon classpath, en utilisant Java 7 NIO:

 ...
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

...

Files.readAllLines(
    Paths.get(this.getClass().getResource("res.txt").toURI()), Charset.defaultCharset());
 

NB ceci est un exemple de comment cela peut être fait. Vous devrez apporter des améliorations si nécessaire. Cet exemple ne fonctionnera que si le fichier est réellement présent sur votre chemin de classe, sinon une exception NullPointerException sera levée lorsque getResource () renvoie null et que .TOURI () est invoquée dessus.

27voto

tangens Points 17733

S'il vous plaît essayez

 InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");
 

Vos essais n'ont pas fonctionné car seul le chargeur de classe pour vos classes est capable de charger à partir du classpath. Vous avez utilisé le chargeur de classe pour le système Java lui-même.

16voto

webcom Points 61

Pour obtenir le chemin absolu de la classe, essayez ceci:

 String url = this.getClass().getResource("").getPath();
 

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