Looking for java Keywords? Try Ask4Keywords

Java LanguageRessourcen (auf Klassenpfad)


Einführung

Java ermöglicht das Abrufen von dateibasierten Ressourcen, die in einer JAR-Datei neben kompilierten Klassen gespeichert sind. Dieses Thema konzentriert sich darauf, diese Ressourcen zu laden und für Ihren Code verfügbar zu machen.

Bemerkungen

Eine Ressource besteht aus dateiähnlichen Daten mit einem pfadähnlichen Namen, der sich im Klassenpfad befindet. Die häufigste Verwendung von Ressourcen ist das Bündeln von Anwendungsbildern, Sounds und schreibgeschützten Daten (z. B. Standardkonfiguration).

Auf die Ressourcen kann mit den Methoden ClassLoader.getResource und ClassLoader.getResourceAsStream zugegriffen werden. Der häufigste Anwendungsfall besteht darin, Ressourcen in demselben Paket wie die Klasse abzulegen, in der sie gelesen werden. Die Methoden Class.getResource und Class.getResourceAsStream dienen diesem allgemeinen Anwendungsfall.

Der einzige Unterschied zwischen einer getResource-Methode und der getResourceAsStream-Methode besteht darin, dass erstere eine URL zurückgibt, während letztere diese URL öffnet und einen InputStream zurückgibt.

Die Methoden von ClassLoader akzeptieren einen pfadähnlichen Ressourcennamen als Argument und durchsuchen jede Position im Classpath des ClassLoader nach einem Eintrag, der diesem Namen entspricht.

  • Wenn ein Classpath-Speicherort eine JAR-Datei ist, wird ein Jar-Eintrag mit dem angegebenen Namen als Übereinstimmung betrachtet.
  • Wenn ein Classpath-Speicherort ein Verzeichnis ist, wird eine relative Datei unter diesem Verzeichnis mit dem angegebenen Namen als Übereinstimmung betrachtet.

Der Ressourcenname ähnelt dem Pfadteil einer relativen URL. Auf allen Plattformen werden Schrägstriche ( / ) als Verzeichnisseparatoren verwendet. Es darf nicht mit einem Schrägstrich beginnen.

Die entsprechenden Methoden von Class sind ähnlich, außer:

  • Der Ressourcenname kann mit einem Schrägstrich beginnen. In diesem Fall wird der anfängliche Schrägstrich entfernt und der Rest des Namens an die entsprechende Methode von ClassLoader übergeben.
  • Wenn der Ressourcenname nicht mit einem Schrägstrich beginnt, wird er als relativ zu der Klasse behandelt, deren getResource- oder getResourceAsStream-Methode aufgerufen wird. Der tatsächliche Ressourcenname wird zu Paket / Name , wobei Paket der Name des Pakets ist, zu dem die Klasse gehört, wobei jeder Punkt durch einen Schrägstrich ersetzt wird, und Name das ursprüngliche Argument für die Methode ist.

Zum Beispiel:

package com.example;

public class ExampleApplication {
    public void readImage()
    throws IOException {

        URL imageURL = ExampleApplication.class.getResource("icon.png");

        // The above statement is identical to:
        // ClassLoader loader = ExampleApplication.class.getClassLoader();
        // URL imageURL = loader.getResource("com/example/icon.png");

        Image image = ImageIO.read(imageURL);
    }
}

Ressourcen sollten in benannten Paketen und nicht im Stammverzeichnis einer JAR-Datei abgelegt werden. Aus demselben Grund werden Klassen in Paketen platziert: Um Kollisionen zwischen mehreren Anbietern zu vermeiden. Wenn sich zum Beispiel mehrere .jar-Dateien im Klassenpfad befinden und mehr als eine von ihnen einen Eintrag config.properties im Stammverzeichnis enthält, geben Aufrufe der Methoden getResource oder getResourceAsStream die Datei config.properties aus dem ersten Verzeichnis zurück der Klassenpfad Dies ist kein vorhersagbares Verhalten in Umgebungen, in denen die Klassenpfadreihenfolge nicht direkt von der Anwendung gesteuert wird, wie z. B. Java EE.

Alle getResource- und getResourceAsStream-Methoden geben null wenn die angegebene Ressource nicht vorhanden ist. Da der Anwendung zum Erstellungszeitpunkt Ressourcen hinzugefügt werden müssen, sollten deren Speicherorte bekannt sein, wenn der Code geschrieben wird. Ein Fehler beim Finden einer Ressource zur Laufzeit ist in der Regel das Ergebnis eines Programmierfehlers.

Ressourcen sind schreibgeschützt. Es ist nicht möglich, auf eine Ressource zu schreiben. Anfänger begehen häufig den Fehler, anzunehmen, dass die Ressource bei der Entwicklung in einer IDE (wie Eclipse) eine separate physische Datei ist. Daher ist es sicher, dass sie im allgemeinen Fall als separate physische Datei behandelt wird. Dies ist jedoch nicht korrekt. Anwendungen werden fast immer als Archive wie JAR- oder WAR-Dateien verteilt, und in solchen Fällen ist eine Ressource keine separate Datei und kann nicht beschrieben werden. (Die getFile-Methode der URL-Klasse ist keine Lösung für dieses Problem; sie gibt trotz ihres Namens lediglich den Pfadteil einer URL zurück, der keinesfalls als gültiger Dateiname garantiert ist.)

Es gibt keine sichere Möglichkeit, Ressourcen zur Laufzeit aufzulisten. Da wiederum die Entwickler dafür verantwortlich sind, Ressourcendateien zur Buildzeit hinzuzufügen, sollten sie ihre Pfade bereits kennen. Es gibt zwar Problemumgehungen, sie sind jedoch nicht zuverlässig und scheitern schließlich.

Ressourcen (auf Klassenpfad) Verwandte Beispiele