getResourceAsStream retourne null

je charge un fichier texte à partir d'un paquet dans un bocal compilé de mon projet Java. La structure des répertoires pertinents est la suivante:

/src/initialization/Lifepaths.txt

Le code utilisé pour charger le fichier est:

public class Lifepaths {
    public static void execute() {
        System.out.println(Lifepaths.class.getClass().
            getResourceAsStream("/initialization/Lifepaths.txt"));
    }

    private Lifepaths() {}

    //This is temporary; will eventually be called from outside
    public static void main(String[] args) {execute();}
}

l'impression sera toujours null , peu importe ce que j'utilise. Je ne sais pas pourquoi cela ne marcherait pas, donc j'ai aussi essayé:

  • "/src/initialization/Lifepaths.txt"
  • "initialization/Lifepaths.txt"
  • "Lifepaths.txt"

aucun de ces travaux. j'ai lire nombreux questions jusqu'à présent sur le sujet, mais aucun d'eux n'ont été utiles - habituellement, ils disent juste de charger des fichiers en utilisant le chemin racine, ce que je fais déjà. Cela, ou tout simplement charger le fichier à partir du répertoire courant (il suffit de charger filename ), que j'ai aussi éprouvé. Le fichier est compilé dans le BOCAL dans l'emplacement approprié avec le nom approprié.

comment résoudre cela?

117
demandé sur Community 2013-05-15 20:37:01

12 réponses

Lifepaths.class.getClass().getResourceAsStream(...) charge les ressources en utilisant le chargeur de classe système, il est évident qu'il échoue parce qu'il ne voit pas vos bocaux

Lifepaths.class.getResourceAsStream(...) charge les ressources en utilisant la même classe de chargeuse que la classe Lifepaths chargée et elle devrait avoir accès aux ressources dans vos bocaux

113
répondu hoaz 2013-05-15 17:06:24

les règles sont les suivantes:

  1. Vérifiez l'emplacement du fichier que vous voulez charger à l'intérieur du bocal (et donc assurez-vous qu'il a bien été ajouté au bocal)
  2. utiliser soit un chemin absolu: le chemin commence à la racine du pot
  3. utilisez un chemin relatif: le chemin commence dans le répertoire du paquet de la classe que vous appelez getResource / getResoucreAsStream

Et d'essayer:

Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")

au lieu de

Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")

(pas sûr si cela fait une différence, mais le premier utilisera le bon ClassLoader/ JAR, alors que je ne suis pas sûr avec le second)

45
répondu Puce 2013-05-15 17:03:00

il y a donc plusieurs façons d'obtenir une ressource à partir d'un bocal et chacune a une syntaxe légèrement différente où le chemin doit être spécifié différemment.

la meilleure explication que j'ai vu est cet article de JavaWorld . Je vais résumer ici, mais si vous voulez en savoir plus, vous devriez consulter l'article.

méthodes

1) ClassLoader.getResourceAsStream() .

"151940920 Format": "/"noms séparés; pas de "/" (tous les noms sont absolues).

exemple: this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties");

2) Class.getResourceAsStream()

Format: "/ "- noms séparés; le titre " / " indique les noms absolus; tous les autres noms sont relatifs au paquet de la classe

exemple: this.getClass().getResourceAsStream("/some/pkg/resource.properties");

33
répondu greedybuddha 2016-07-12 12:29:11

N'utilisez pas de chemins absolus, mettez-les en relation avec le répertoire 'resources' de votre projet. Code rapide et sale qui affiche le contenu de MyTest.txt du répertoire 'resources'.

@Test
public void testDefaultResource() {
    // can we see default resources
    BufferedInputStream result = (BufferedInputStream) 
         Config.class.getClassLoader().getResourceAsStream("MyTest.txt");
    byte [] b = new byte[256];
    int val = 0;
    String txt = null;
    do {
        try {
            val = result.read(b);
            if (val > 0) {
                txt += new String(b, 0, val);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
    } while (val > -1);
    System.out.println(txt);
}
12
répondu Paul Smith 2014-07-16 15:58:24

vous pourriez essayer ceci pour obtenir le stream I. e d'abord obtenir l'url, puis l'ouvrir comme stream.

URL url = getClass().getResource("/initialization/Lifepaths.txt"); 
InputStream strm = url.openStream(); 

j'ai déjà eu une question similaire: lire le fichier txt de jar échoue mais lire des travaux d'image

9
répondu MrD 2017-05-23 12:34:45

il semble y avoir un problème avec le ClassLoader que vous utilisez. Utilisez le contextClassLoader pour charger class. Ceci indépendamment du fait qu'il s'agisse d'une méthode statique/non statique

Thread.currentThread().getContextClassLoader().getResourceAsStream ......

6
répondu Binita Bharati 2015-09-27 01:56:03

Je ne sais pas si de l'aide, mais dans mon cas j'ai eu ma ressource dans le répertoire /src/ et j'ai eu cette erreur. J'ai ensuite déplacé l'image dans le dossier bin et il a corrigé le problème.

2
répondu Leo Ufimtsev 2015-01-05 18:53:07

assurez-vous que votre répertoire de ressources (par exemple" src") se trouve dans votre classpath (assurez-vous que c'est un répertoire source dans votre chemin de compilation dans eclipse).

assurez-vous que clazz est chargé à partir du classloader principal.

ensuite, pour charger src/initialization / Lifepaths.txt, utiliser

clazz.getResourceAsStream("/initialization/Lifepaths.txt");

pourquoi: clazz.getResourcesAsStream(foo) recherche foo à partir de dans le chemin de classe de clazz , relatif au répertoire clazz lives dans . Le premier " / " le fait Charger à partir de la racine de n'importe quel répertoire dans la classpath de clazz.

sauf si vous êtes dans une sorte de conteneur, comme Tomcat, ou si vous faites quelque chose avec ClassLoaders directement, Vous pouvez simplement traiter votre classepath eclipse/command line comme le seul classloader classpath.

2
répondu Bobby Martin 2015-08-24 13:17:03

je me suis trouvé dans une question similaire. Comme j'utilise maven, j'ai dû mettre à jour ma pom.xml pour inclure quelque chose comme ceci:

   ...
</dependencies>
<build>
    <resources>
        <resource>
            <directory>/src/main/resources</directory>
        </resource>
        <resource>
            <directory>../src/main/resources</directory>
        </resource>
    </resources>
    <pluginManagement>
        ...

notez l'étiquette de ressource pour spécifier où se trouve ce dossier. Si vous avez des projets imbriqués (comme je le fais) alors vous pourriez vouloir obtenir des ressources d'autres domaines au lieu de simplement dans le module dans lequel vous travaillez. Cela permet de réduire la conservation du même fichier dans chaque repo si vous utilisez des données de configuration similaires

1
répondu plosco 2016-11-08 00:12:31

dans mon cas, rien ne marchait à moins que je ne supprime les espaces des noms de fichiers...

0
répondu user3563159 2018-10-04 13:14:17

ce qui a fonctionné pour moi était d'ajouter le fichier sous mon projet / Ressources Java / src puis utiliser

this.getClass().getClassLoader().getResourceAsStream(myfile.txt);

Je n'ai pas eu besoin d'expliciter ajouter ce fichier au chemin (l'ajouter à /src fait cela apparemment)

-1
répondu pgonzaleznetwork 2015-12-16 22:43:20

@Emracool... Je vous suggère une alternative. Puisque vous semblez être une tentative de chargement d'un *.fichier txt. Mieux vaut utiliser FileInputStream() plutôt que cette ennuyeuse getClass().getClassLoader().getResourceAsStream() ou getClass().getResourceAsStream() . Au moins votre code s'exécutera correctement.

-12
répondu Jain 2014-04-23 10:08:03