Textdatei statt von Dateisystem aus .jar lesen

s3f3s

Mitglied
Hallo,

ich habe hier eine ziemlich verkorkste Software, die unter anderem unveränderliche Daten aus einer Textdatei aus dem Dateisystem liest. Diese Datei muss bei der Installation mit ausgeliefert werden.
Jetzt würde ich gern die Installation vereinfachen, indem ich diese Datei mit in die .jar hineinnehme, damit bei Änderungen nur die .jar ausgetauscht werden muss.

Was muss ich am Java-Code ändern, damit statt im Dateisystem in der .jar nach der Datei gesucht wird?

Prinzipiell könnte man natürlich die Informationen der Textdatei auch aus einer properties-Datei lesen. Dazu müsste ich allerdings alle Stellen finden, wo diese Informationen verwendet werden. Das ist hier sehr mühsam.
 
So Dateien, die dann vom Classpath gelesen werden, werden mit dem Begriff Ressourcen benannt.

-> In einem Projekt gehören diese Dateien in den resources Ordner. (Also bei maven / gradle wäre das src/main/resouces - aber das muss nicht immer getrennt sein, z.B. Eclipse will alles einfach in src haben.)
-> Gelesen wird dann per ClassLoader. Dazu kann man direkt auf der Klasse oder auf dem ClassLoader eine der Methoden getResource / getResourceAsStream nutzen. Üblich ist, dies auf der Klasse aufzurufen.

Beispiele:
Java:
getClass().getResourceAsStream("windows.fxml"); // gibt einen Stream zurück. Die Datei muss im gleichen "package" liegen wie die Klasse
MyClass.class.getResource("/images/icon.png"); // gibt eine URL zurück, die dann verwendet werden kann. Der Pfad ist absolut vom Resource Ordner aus zu sehen

Somit kannst du die Datei einfach als resource ins Projekt packen um dann den Stream für die Daten per getResourceAsStream zu bekommen.
 
Und wie behandle ich dann den Stream oder die URL weiter?
Ist das, was getResourceAsStream liefert, das gleiche wie
Java:
new FileInputStream(fileName)
?

Und was meinst du mit "Datei im gleichen Package wie die Klasse"? Im gleichen Verzeichnis des src-Ordners, muss dessen Ordnerstruktur im resources-Ordner nachgebildet werden, oder noch anders?
 
Ja, genau, Du kannst das new FileInputStream einfach durch getResourceAsStream ersetzen.

Und was meinst du mit "Datei im gleichen Package wie die Klasse"? Im gleichen Verzeichnis des src-Ordners, muss dessen Ordnerstruktur im resources-Ordner nachgebildet werden, oder noch anders?
Wenn Du die "relativen" Angaben haben willst, dann ja. Das kann Sinn machen, wenn Du wirkliche 1:1 Verbindungen hast. Das typische Beispiel, was mir hier einfällt, sind JavaFX Anwendungen mit fxml Dateien.

Aber sonst ist es einfacher, da eine eigene Struktur zu schaffen und immer absolute Angaben zu nutzen, also immer mit einem "/" zu starten.
 

Zurück
Oben