Ich wollte der WebEngine aus JavaFX eine html gerechte Textresource als Seite übergeben. Leider fordert sie entweder eine Adressangabe dieser Seite in Form eines Strings, der URL gerecht ist, oder die vollständige html gerechte Seite als String. Der zweite Fall ist nur zu empfehlen, wenn der erste Fall garnicht funktionieren will, da damit keine Historie möglich ist. Damit wollte ich unbedingt die Adressangabe als Mittel nehmen.
Leider traten beim Versuch immer wieder unerwartete Unverträglichkeiten auf. Ich entschloss mich deshalb, das Laden von Resourcen im modularen Java ab Version 9 genauer zu untersuchen. Dabei beschränke ich mich aber auf Text-, Bild- und Tonresourcen. Das Laden von *.class bleibt unberücksichtigt.
Welche Methoden aus welchen Klassen gibt es um solche Resourcen zu laden?
Als Methoden gibt es mehrere:
InputStream getResourceAsStream( String name );
- in den Klassen Module, Class und ClassLoader
URL getResource( String name );
- in den Klassen Class und ClassLoader
static InputStream ClassLoader.getSystemResourceAsStream( String name );
- statische Methode im ClassLoader, dient eigentlich nur zum Laden von Klassen
und benutzt den SystemClassLoader.
Eigentlich sollen damit Dateien vom Typ *.class geladen werde.
static URL ClassLoader.getSystemResource( String name );
- statische Methode im ClassLoader, der dann den SystemClassLoader benutzt.
Eigentlich sollen damit Dateien vom Typ *.class geladen werden.
außerdem gibt es noch die Methode, die ich aber nicht weiter untersuche
static Enumeration<URL> getSystemResources( String name )
- Sie sucht alle Ressourcen ( eigentlich vom Typ *.class ) im angegebenen Suchpfad.
Die Klasse Module ist erst mit der Modularisierung von Java eingeführt worden, die anderen beiden gab es schon immer, scheinen aber erweitert bzw geändert worden zu sein.
Aufpassen muss man beim Parameter. Hier ist (meistens) die Schreibweise wichtig. Grundsätzlich muss natürlich der Name mit Endung der Ressource übergeben werden, aber muss mit oder ohne Paketpfad, mit oder ohne einem führenden Schrägstrich angegeben werden.
Mit Paketpfad ist die Paketangabe mit Schrägstrichen statt der Punkte gemeint. Ohne führenden Schrägstrich nenne ich ihn relativ und mit führendem Schrägstrich absolut.
Die Ressource befindet sich bei den folgende Dingen immer im Modul 'm', dort im Paket 'de.firma.res' und hat den Namen 'datei.res'.
Aufrufende Instanz und Resource befinden sich im gleichen Paket und damit auch im gleichen Modul.#
(Es gibt unbenannte Module. Dürfen sich da gleichnamige Pakete befinden?)- Methoden getResourceAsStream( String name )
InputStream strom;
*Module
strom = getClass().getModule().getResourceAsStream( "de/firma/res/datei.res" )
strom = getClass().getModule().getResourceAsStream( "/de/firma/res/datei.res" )
strom = getClass().getModule().getResourceAsStream( "datei.res" )
*Class
strom = getClass().getResourceAsStream( "de/firma/res/datei.res" )
strom = getClass().getResourceAsStream( "/de/firma/res/datei.res" )
strom = getClass().getResourceAsStream( "datei.res" )
*ClassLoader
strom = getClass().getClassLoader().getResourceAsStream( "de/firma/res/datei.res" )
strom = getClass().getClassLoader().getResourceAsStream( "/de/firma/res/datei.res" )
strom = getClass().getClassLoader.getResourceAsStream( "datei.res" )
-
Dies wird demnächst fortgesetzt.
Kai Ehlers