# Daten in JAR speichern geht nicht??



## DStrohma (22. Aug 2009)

Hi Leute,

erst einmal, was habe ich vor: Ich will eine portable JAR-Datei erstellen, die ohne zusätzliche Dateien auskommt. Also nur aus der einen JAR besteht und alle Einstellungen intern speichert. Jetzt muss aber der User gewisse Einstellungen speichern können die beim nächsten Start der JAR erhalten bleiben.

Ich dachte mir das mach ich über eine Properties-Datei die ich dann in der JAR speichere, musste aber rausfinden dass es nicht möglich ist während die JAR ausgeführt wird Daten darin zu speichern - es geht nur lesen...  :-/

Zweite Idee war dann die Klasse Preferences. Da hab ich jetzt aber gelesen dass die Daten die ich da reinspeichere irgendwo auf der Festplatte gespeichert werden. Da meine Anwendung portabel sein muss fällt das auch raus.

IST ES ETWA NICHT MÖGLICH??

Danke für eventuelle Ideen


----------



## Wildcard (23. Aug 2009)

Möglich schon, aber nicht auf allen Plattformen. Windows zum Beispiel locked per Default alle Dateien aus denen gelesen wird (dein jar beim ausführen), also ist es auf Windows schonmal nicht möglich das sich dein jar selbst updated.
Davon abgesehen ist soetwas immer eine schlechte Idee. Was passiert bei einem Absturz oder IO Fehler? Dann hat sich dein Programm selbst zerstört.


----------



## Spacerat (23. Aug 2009)

Was ist denn an einer Preferences-Klasse auszusetzen? Das so ein Teil Dateien "irgendwo auf der Platte" speichert, kann man kaum ernst nehmen. In Java hat man doch Möglichkeiten relative Dateipfade selbst anzulegen. Als Basis könnte man z.B. bei "System.getProperty("user.dir")" (oder ähnlich...  ) nehmen. Java kommt auch afaik in allen Betriebssystemen mit dem Slash ("/") als Verzeichnistrennzeichen klar. Man kann sogar das Verzeichnis der gerade ausgeführten Jar-Datei, wenn auch nicht direkt (führt über "getClass().getRessource()"), bekommen.


----------



## DStrohma (25. Aug 2009)

Spacerat hat gesagt.:


> Was ist denn an einer Preferences-Klasse auszusetzen? Das so ein Teil Dateien "irgendwo auf der Platte" speichert, kann man kaum ernst nehmen. In Java hat man doch Möglichkeiten relative Dateipfade selbst anzulegen. Als Basis könnte man z.B. bei "System.getProperty("user.dir")" (oder ähnlich...  ) nehmen. Java kommt auch afaik in allen Betriebssystemen mit dem Slash ("/") als Verzeichnistrennzeichen klar. Man kann sogar das Verzeichnis der gerade ausgeführten Jar-Datei, wenn auch nicht direkt (führt über "getClass().getRessource()"), bekommen.



Das hab ich derzeit so. Nur ich wollte es eben in der .JAR haben...
Damit es portabel ist. Die Preference Klasse speichert die Informationen soweit ich das herausgefunden hab in einer Datei auf der Platte aber wenn ich die .JAR auf einen anderen Computer kopiere, dann muss die wieder neu angelegt werden. Ich kann da also keine Informationen reinpacken die ich auslesen will.
Aber Wildcard's Argumente geben mir zu denken


----------



## The_S (25. Aug 2009)

Dann schreib doch ne Export und Import Funktion für die Dateien. So kann man die Daten mitnehmen. Außerdem ist es doch normal, dass auf einem anderen Rechner andere Daten vorhanden sind, oder nicht ???:L ?


----------



## DStrohma (26. Aug 2009)

The_S hat gesagt.:


> Dann schreib doch ne Export und Import Funktion für die Dateien. So kann man die Daten mitnehmen. Außerdem ist es doch normal, dass auf einem anderen Rechner andere Daten vorhanden sind, oder nicht ???:L ?



ich will aber interne daten des programmes speichern... die sollten doch bitte auf jedem computer die gleichen sein. es geht um sachen wie den pfad den ein user festlagen kann um von dort weitere daten zu holen, die ausrichtung und größe der fenster usw.
wenn ich das mit der klasse Preferences mach und das programm auf einen anderen rechner installiere, sind diese vorher eingestellten daten weg. es scheint also nicht anders zu gehen als die benötigsten daten in eine extra datei auszulagern (genau das wollte ich vermeiden aber es geht dann wohl doch nicht)


----------



## The_S (27. Aug 2009)

DStrohma hat gesagt.:


> es geht um sachen wie den pfad den ein user festlagen kann um von dort weitere daten zu holen, die ausrichtung und größe der fenster usw.



Das finde ich ja noch weitaus unlogischer! Warum sollte der Pfad auf jedem Rechner gleich sein? User A legt diesen "Pfad" auf sein X-Laufwerk. User B hat aber kein X-Laufwerk, das Programm verweist aber trotzdem darauf ... Sinn? Genauso die Ausrichtung und Größe der Fenster. User A hat eine Displayauflösung von 2560x1600 und macht die Anwendung auf Vollbild. User B hat eine Displayauflösung von 1024x768 - das Fenster ist viel zu groß. Ähnliches mit der Positionierung der Fenster.

Und wenn du die Datei "extern" speicherst, musst du sie trotzdem (auch wenn es sinnlos ist) überall mit hin schleifen. Da kannste auch genauso gut Preferences mitsamt Import und Export Funktion anbieten.


----------



## DStrohma (30. Aug 2009)

hab mich wohl undeutlich ausgedrückt:

alle daten die der benutzer einstellt, sollen so sein wie er sie eingestellt hat. macht keinen sinn? egal, is einfach so 
ich nehme dabei an, dass ein und der gleiche benutzer die .jar auf verschiedenen rechnern verwendet und die daten immer dabei hat. (wenn ich das mit Preferences mach, sind die daten weg wenn ein anderer rechner benutzt wird).

die daten sollen natürlich auch änderbar sein...
das geht nicht anders als es in eine datei zu packen und es irgendwo abzuspeichern. genau das wollte ich nicht, ich wollt's direkt in die .jar, das geht aber nicht also problem erledigt )

(hängt euch nicht an werten wie 'auflösung' oder 'pfad' auf. das waren lediglich schlechte beispiele. mir geht es um optionen wie "windows effekte ein/aus", "verwendetes LAF", usw... und das stichwort heißt eben "portabel". geht nicht mit preferences)

PS: wie kann ich den thread als "erledigt" deklarieren?

und DANKE für all die antworten


----------



## The_S (31. Aug 2009)

"Portable" Applikationen speichern ihre Informationen relativ zu dem Verzeichnis, in dem Sie liegen (meistens ein Verzeichnis auf einem USB-Stick). Die Info hätteste und ruhig vorher zukommen lassen können - und ja, die Beispiele waren verdammt schlecht gewählt. Aber gut, hat sich ja jetzt erledigt  .


----------



## DStrohma (31. Aug 2009)

The_S hat gesagt.:


> "Portable" Applikationen speichern ihre Informationen relativ zu dem Verzeichnis, in dem Sie liegen (meistens ein Verzeichnis auf einem USB-Stick). Die Info hätteste und ruhig vorher zukommen lassen können - und ja, die Beispiele waren verdammt schlecht gewählt. Aber gut, hat sich ja jetzt erledigt  .



ich habs relativ gespeichert, sorry nochmal...
aber ich weis jetzt immer noch nicht wie ich einen thread als 'erledigt' deklariere


----------



## The_S (31. Aug 2009)

DStrohma hat gesagt.:


> ich habs relativ gespeichert, sorry nochmal...



Aber hoffentlich nicht so!? 
	
	
	
	





```
System.getProperty("user.dir")
```


----------



## Painii (31. Aug 2009)

DStrohma hat gesagt.:


> ich habs relativ gespeichert, sorry nochmal...
> aber ich weis jetzt immer noch nicht wie ich einen thread als 'erledigt' deklariere



Auf "Frage offen" drücken.

Und wenn jeder User seine eigenen Einstellungen für das Programm hat, dann würd ich einfach eine config-datei für jeden User bauen (die er lokal für sich speichert), und die dann beim Programm-start übergeben, damit es damit initialisiert wird.
Ist bestimmt auch der ganze Sinn von Properties, wo ich mich nicht reingelesen hab


----------



## DStrohma (31. Aug 2009)

Painii hat gesagt.:


> Und wenn jeder User seine eigenen Einstellungen für das Programm hat, dann würd ich einfach eine config-datei für jeden User bauen (die er lokal für sich speichert), und die dann beim Programm-start übergeben, damit es damit initialisiert wird.
> Ist bestimmt auch der ganze Sinn von Properties, wo ich mich nicht reingelesen hab



jo, so hab ich's jetzt auch.




The_S hat gesagt.:


> Aber hoffentlich nicht so!?
> 
> 
> 
> ...



ich hab da:

```
Properties pr = new Properties();
pr.load(new FileInputStream(settingsFilename));

windowEffects = Boolean.parseBoolean(pr.getProperty("Effects"));
decoration = pr.getProperty("Decoration");

usw.
```


----------



## The_S (31. Aug 2009)

Und wo zeigt das SettingFile hin?


----------



## Spacerat (31. Aug 2009)

"Nicht zu empfehlen" ist die falsche Wortwahl. Wenn man Einstellungen einer Anwendung Benutzerbezogen speichern will, empfiehlt sich das sehr. Wenn man aber die Einstellungen systemweit für jeden Benutzer gleich speichern will, müsste man sich das Verzeichnis beschaffen, in welchem die Anwendung installiert wurde. Meines wissens bekommt man das nur (w.g. nicht direkt) über "getClass().getRessource()".


----------



## DStrohma (31. Aug 2009)

The_S hat gesagt.:


> Und wo zeigt das SettingFile hin?



ich habs so festgelegt, dass meine settings-file immer im gleichen verzeichniss sein muss wie die ausführbare .jar. also ist bei mir die variable 'settingsFilename' wirklich nur der filename --> 'settings.ini'

und da es ja um eine portable anwendung geht, muss die settings file auch nicht umbedingt existieren, wenn das der fall ist, werden eben standard-einstellungen hergenommen.

ich versteh jetzt endlich worauf ihr hinaus wollt 
ich speicher zwar auch pfade in der settings-file aber keine angst  ich hab ne eigene klasse die mir die relativen pfade erstellt und die settings-file selbst braucht gar keinen pfad.


----------



## The_S (31. Aug 2009)

"settings.ini" verweist aber auf das Ausführungsverzeichnis, was nicht zwingend identisch mit dem Verzeichnis sein muss, in welchem sich das JAR befindet. Das nur zur Info für dich.


----------



## DStrohma (31. Aug 2009)

The_S hat gesagt.:


> "settings.ini" verweist aber auf das Ausführungsverzeichnis, was nicht zwingend identisch mit dem Verzeichnis sein muss, in welchem sich das JAR befindet. Das nur zur Info für dich.



doch die befindet sich zwinged in dem gleichen verzeichniss. das is so festgelegt.
hab meinen letzen post noch erweitert aber scheinbar zu spät 
ihr antwortet zu schnell :bae:


----------



## The_S (31. Aug 2009)

DStrohma hat gesagt.:


> doch die befindet sich zwinged in dem gleichen verzeichniss. das is so festgelegt.



äh ... ja ... und wer legt das fest? Ich glaube du hast meine Aussage missverstanden!

Wenn du in deinem Programm auf die Datei "settings.ini" (ohne Pfadangabe) zugreifst, dann schaut Java nicht in das Verzeichnis, in dem die JAR-Datei liegt, und sucht die "settings.ini"-Datei, sondern in das Ausführungsverzeichnis, von welchem das JAR ausgeführt wurde (was meistens mit dem Verzeichnis, in welchem sich die JAR befindet übereinstimmt, aber eben nicht immer).


----------



## The_S (31. Aug 2009)

DStrohma hat gesagt.:


> hab meinen letzen post noch erweitert aber scheinbar zu spät
> ihr antwortet zu schnell :bae:



Diese Änderung habe ich auch nicht mehr mitbekommen  . Trotzdem wollte ich da nicht drauf hinaus, siehe meinen letzten Beitrag  .


----------



## bygones (31. Aug 2009)

ums nochmal kurz zu erklaeren:

```
public class Foo {
    public static void main(String[] args) {
        System.out.println(System.getProperty("user.dir"));
    }
}
```
als jar gepackt und nach [c]/tmp[/c] gelegt.

Im /tmp verzeichnis gestartet ueber [c]java -jar test.jar[/c] wird auch /tmp ausgegeben.... wechselt man nun in ein anderes verzeichnis zB [c]/home/user/theUser[/c] und startet [c]java -jar /tmp/test.jar[/c] wird /home/user/theUser ausgegeben....

wens interessiert ;-)


----------



## The_S (31. Aug 2009)

bygones hat gesagt.:


> ums nochmal kurz zu erklaeren:
> 
> ```
> public class Foo {
> ...



Genau das ist das, was ich meinte. Ich war nur zu faul es so ausführlich zu erklären


----------



## DStrohma (31. Aug 2009)

The_S hat gesagt.:


> äh ... ja ... und wer legt das fest? Ich glaube du hast meine Aussage missverstanden!
> 
> Wenn du in deinem Programm auf die Datei "settings.ini" (ohne Pfadangabe) zugreifst, dann schaut Java nicht in das Verzeichnis, in dem die JAR-Datei liegt, und sucht die "settings.ini"-Datei, sondern in das Ausführungsverzeichnis, von welchem das JAR ausgeführt wurde (was meistens mit dem Verzeichnis, in welchem sich die JAR befindet übereinstimmt, aber eben nicht immer).



hmm, hast recht, habs grad mit ner .bat probiert und der sucht die file dann in dem verzeichniss... ok  is nicht weiter schlimm da dann die standart-einstellunge verwendet werden aber ja, is 'n bug. ich korrigiers. DANKE!


----------

