Chargement de fichiers par getClass().getResource()

j'ai suivi la méthode de chargement du fichier de ressources en utilisant getClass.getResource(path). L'extrait de code est ici :

String url = "Test.properties";

System.out.println("Before printing paths..");
System.out.println("Path2: "+ getClass().getResource(url).getPath());

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
i_propConfig.load(inputStream);
inputStream.close();

Je l'ai configuré dans eclipse avec la hiérarchie (sous source il y a un dossier appelé SwingDemo. En SwingDemo il y a mon fichier java ainsi que la ressource fichier.)..

  1. src
    • SwingDemo
      1. CustomDialog.java
      2. de Test.propriétés

quand j'exécute ceci sur eclipse tout va bien. Mais dès que je tente d'exécuter les applications de cmd Line null pointer exception se produit..

la hiérarchie de déploiement en ligne de commande est la suivante:

Dossier : D:WorkJava ProgrmsSwingDemo

Hiérarchie:

  1. SwingDemo
    • CustomDialog.java
    • de Test.propriétés

tout d'Abord j'ai compilé ce fichier à l'intérieur SwingDemo dossier de la ligne de commande (javac CustomDialog.java). Puis je recule d'un pas vers le dossier Java Programs (comme je l'ai mentionné à l'intérieur du paquet).classe java) et d'exécuter les applications en utilisant le célèbre

java SwingDemo.CustomDialog

je suivais des étapes similaires lorsque J'utilisais New FileInputStream ("path") précédemment. Après avoir fait cette mode je reçois l'exception de pointeur nulle..

je pense que getClass().getResource(url) ne peut pas charger un fichier à partir d'un répertoire spécifique. C'est pourquoi j'ai mis la ressource dans le même répertoire que celui de mon fichier java. Il fonctionnait bien dans Eclipse. Mais pourquoi cela donne l'erreur quand je cours de la ligne de commande.

35
demandé sur Andrew Thompson 2012-12-30 11:49:11

2 réponses

getClass().getResource() utilise le chargeur de classe pour charger la ressource. Cela signifie que la ressource doit être dans le classpath pour être chargé.

quand vous le faites avec Eclipse, tout ce que vous mettez dans le dossier source est "compilé" par Eclipse:

  • .fichiers java sont compilés dans .les fichiers de classe qui vont le répertoire bin (par défaut)
  • les autres fichiers sont copiés dans le répertoire bin (en respectant la hiérarchie paquet/dossier)

Lors du lancement de le programme avec Eclipse, le répertoire bin est donc dans la classpath, et puisqu'il contient le Test.fichier de propriétés, ce fichier peut être chargé par le chargeur de classe, en utilisant getResource() ou getResourceAsStream().

si cela ne fonctionne pas à partir de la ligne de commande, c'est donc parce que le fichier n'est pas dans classpath.

notez que vous ne devez pas faire

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));

pour charger une ressource. Parce que cela ne peut fonctionner que si le fichier est chargé à partir du système de fichiers. Si vous empaquetez votre application dans un fichier jar, ou si vous chargez les classes sur un réseau, il ne fonctionnera pas. Pour obtenir une entrée, il suffit d'utiliser

getClass().getResourceAsStream("Test.properties")

Et enfin, comme l'indique la documentation,

Foo.class.getResourceAsStream("Test.properties")

charge un essai.fichier de propriétés situé dans le même paquet que la classe Foo.

Foo.class.getResourceAsStream("/com/foo/bar/Test.properties")

charge un essai.fichier de propriétés situé dans le paquet com.foo.bar.

65
répondu JB Nizet 2012-12-30 08:05:20

la meilleure façon d'accéder aux fichiers à partir d'un dossier ressource à l'intérieur d'un bocal est d'utiliser L'entrée via getResourceAsStream. Si vous avez encore besoin d'une instance de la ressource en tant que fichier, vous pouvez copier la ressource en tant que flux dans un fichier temporaire (le fichier temp sera supprimé lorsque la JVM sortira):

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
11
répondu Lukas Masuch 2016-02-17 19:32:24