wake-up-neo.com

Datei wird von getClass () geladen. GetResource ()

Ich habe die Methode zum Laden der Ressourcendatei mithilfe von getClass.getResource(path) befolgt. Der Codeausschnitt ist hier:

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();

Ich habe es in Eclipse mit der Hierarchie konfiguriert (Unter Quelle gibt es einen Ordner namens SwingDemo. In SwingDemo gibt es meine Java Datei sowie die Ressourcendatei) ...

  1. src
    • SwingDemo
      1. CustomDialog.Java
      2. Test.Eigenschaften

Wenn ich dies auf Eclipse laufen lasse, läuft alles gut. Aber sobald ich versuche, die Apps von cmd aus auszuführen, tritt eine Nullzeiger-Ausnahme auf.

Die Befehlszeilenbereitstellungshierarchie lautet wie folgt:

Ordner: D:\Work\Java Progrms\SwingDemo

Hierarchie:

  1. SwingDemo
    • CustomDialog.Java
    • Test.Eigenschaften

Zuerst habe ich diese Datei im Ordner SwingDemo von der Kommandozeile kompiliert (javac CustomDialog.Java). Dann gehe ich einen Schritt zurück in den Ordner Java Programs) (wie ich das Paket in der .Java-Klasse erwähnt habe) und starte die Apps mit dem berühmten

Java SwingDemo.CustomDialog

Ich habe ähnliche Schritte ausgeführt, als ich zuvor den neuen FileInputStream ("Pfad") verwendet habe. Auf diese Weise erhalte ich eine Nullzeiger-Ausnahme.

Ich denke, getClass().getResource(url) kann keine Datei aus einem bestimmten Verzeichnis laden. Das ist der Grund, warum ich die Ressource in dasselbe Verzeichnis wie meine Java) -Datei gestellt habe. In Eclipse lief sie einwandfrei.

42
AnjanN

getClass().getResource() verwendet das Klassenladeprogramm, um die Ressource zu laden. Dies bedeutet, dass sich die Ressource im zu ladenden Klassenpfad befinden muss.

Wenn Sie dies mit Eclipse tun, wird alles, was Sie in den Quellordner legen, von Eclipse "kompiliert":

  • .Java-Dateien werden in .class-Dateien kompiliert, die sich im bin-Verzeichnis befinden (standardmäßig).
  • andere Dateien werden in das bin-Verzeichnis kopiert (unter Berücksichtigung der Paket-/Ordner-Hirearchy)

Wenn Sie das Programm mit Eclipse starten, befindet sich das Verzeichnis bin im Klassenpfad. Da es die Datei Test.properties enthält, kann diese Datei vom Klassenladeprogramm mit getResource() oder getResourceAsStream() geladen werden. .

Wenn es nicht über die Befehlszeile funktioniert, liegt dies daran, dass sich die Datei nicht im Klassenpfad befindet.

Beachten Sie, dass Sie NICHT tun sollten

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

eine Ressource laden. Denn das kann nur funktionieren, wenn die Datei aus dem Dateisystem geladen wird. Wenn Sie Ihre App in eine JAR-Datei packen oder die Klassen über ein Netzwerk laden, funktioniert dies nicht. Um einen InputStream zu erhalten, verwenden Sie einfach

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

Und schließlich, wie die Dokumentation zeigt,

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

lädt eine Test.properties-Datei, die sich im selben Paket wie die Klasse Foo befindet.

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

lädt eine Test.properties-Datei aus dem Paket com.foo.bar.

72
JB Nizet

Der beste Weg, um auf Dateien aus einem Ressourcenordner in einer JAR zuzugreifen, ist die Verwendung des InputStream über getResourceAsStream. Wenn Sie die Ressource weiterhin als Dateiinstanz benötigen, können Sie die Ressource als Stream in eine temporäre Datei kopieren (die temporäre Datei wird gelöscht, wenn die JVM beendet wird):

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;
    }
}
16
Lukas Masuch