PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java - Wie Einstellungen für ein Programm speichern und laden?


Sephiroth
2009-05-14, 17:49:42
Ich möchte das die Einstellungen, die der Benutzer im Programm vorgenommen hat, dauerhaft gespeichert und beim Starten des Programms wieder geladen werden.
Wie gehe ich da idealerweise vor und gibt es da eventuell auch schon Vorlagen?

Meine Herangehensweise wäre jetzt die, eine ini Datei im Benutzerverzeichnis abzulegen und dort die Werte entsprechend serialisiert abzulegen.

Laz-Y
2009-05-14, 18:03:30
So würd ich das auch machen (bzw. hab ich das gemacht). Vorlagen sind mir keine bekannt, ich hab meine Einstellungen allerdings als XML abgelegt, das ist nicht besonders schwer und der User soll da eh nichts rumpfuschen.

Wichtig ist, dass Du es wirklich im Benutzerverzeichnis ablegst und nicht im Programmverzeichnis, weil es sonst unter Vista nicht läuft.

Abnaxos
2009-05-14, 18:16:36
Das Einfachste ist es, die Preferences-API zu verwenden, also die Klassen unter java.util.prefs. Die sind ab JDK 1.4 verfügbar. Diese API legt unter UNIX die Einstellungen in ~/.java/... im XML-Format ab, unter Windows verwendet es die Registry.

Ansonsten findest du im System-Property den Wert user.home, der das Heimat-Verzeichnis des Benutzers angibt. Unter UNIX kannst du da einfach eine Datei “.meine-einstellungen.properties” anlegen. Bei Windows weiss ich jetzt gerade nicht auswendig, ob user.home auf die Einstellungen des Benutzers oder auf “Eigene Dateien” zeigt ─ Letzteres würden dann viele Benutzer vermutlich als störend empfinden. Die meisten Java-Programme, die ich kenne und die nicht die Preferences-API verwenden, machen aber genau das.

Im schlimmsten Fall musst du eine OS-Unterscheidung machen, oder du könntest dem Programm ein System-Property mitgeben, das bestimmt, wo die Daten abgelegt werden sollen, und dieses in einem plattformabhängigen Starter-Script der Plattform entsprechend setzen. Für Windows gibt es da diverse Lösungen, die ein Java-Programm als eine Art Self-Extracting-Zip verpacken, das sich allerdings nicht extrahiert, sondern eine JVM startet, und Ähnliches (ein bekanntes Beispiel wäre das Spiel “Edna bricht aus” ─ man gebe da mal “unzip -l edna.exe” ein).

Die einfachste Variante dürfte die Preferences-API sein.

Edit: Serialisieren ist eine schlechte Idee für solche Zwecke, wenn, dann java.beans.XMLEncoder/Decoder verwenden. Serialisierung ist für Langzeit-Speicherung von Daten zu zerbrechlich.

Shink
2009-05-14, 18:45:54
Apache Commons Configuration ist ganz praktisch.

Monger
2009-05-14, 18:59:59
Bei Windows weiss ich jetzt gerade nicht auswendig, ob user.home auf die Einstellungen des Benutzers oder auf “Eigene Dateien” zeigt ─ Letzteres würden dann viele Benutzer vermutlich als störend empfinden.
Ich muss zugeben, ich weiß auch nicht wie die Preferences unter Java das lösen - aber ich kann sagen, wo es eigentlich hin sollte: nämlich in den Application Data Ordner des jeweiligen Benutzers. Auf jeden Fall ist die Preferences API das was man sich anschauen sollte.

RattuS
2009-05-14, 19:37:00
INI ist schon etwas verstaubt IMO. Mit XML fährt man die Zukunft, wobei mich ein Geschwindigkeitsvergleich zwischen den beiden mal sehr interessieren würde.

Exxtreme
2009-05-14, 19:50:45
INI ist schon etwas verstaubt IMO. Mit XML fährt man die Zukunft, wobei mich ein Geschwindigkeitsvergleich zwischen den beiden mal sehr interessieren würde.
Ich glaube, um irgendwelche Programmeinstellungen zu speichern, ist es gehüpft wie gesprungen ob Plain Text oder XML. Ob das in 0,002 oder 0,000343 Sekunden eingelesen wurde, das bemerkt der Nutzer nicht wirklich. ;)

Pinoccio
2009-05-14, 19:56:14
INI ist schon etwas verstaubt IMO. Mit XML fährt man die Zukunft, wobei mich ein Geschwindigkeitsvergleich zwischen den beiden mal sehr interessieren würde.Geschwindigkeit beim Entwicklen: da dürfte XML deutlich vorne liegen, da alle Bibliotheken quasi fertig da sind. Beim Einlesen hängt es von verschieden Faktoren ab, aber eine einfache, durchdachte (=gut zu parsen) INI ist vermutlich fixer.

mfg

Sephiroth
2009-05-14, 20:09:56
Danke für eure zahlreichen Hinweise. :smile:

java.util.prefs nutzt per default die Registry unter Windows, was ich schonmal doof finde. :tongue: Es gibt zwar Erweiterungen mit Dateien statt der Registry (http://www.koders.com/java/fid87CFEDED5EF625BA4E027A32E375B1E96656BAFA.aspx) aber ich werd erstmal mit org.apache.commons.configuration rumspielen.

The_Invisible
2009-05-14, 23:02:49
naja, so eine ini parser-klasse hat man sonst auch schnell selber zusammengebastelt.

das qt framework hätte für dein vorhaben sogar alles schon integriert inklusive so spielereien wie laden/speichern der fensterpositionen :D

steht aber hier wohl nicht zur debatte.

mfg

Abnaxos
2009-05-15, 00:03:27
Ich muss zugeben, ich weiß auch nicht wie die Preferences unter Java das lösen - aber ich kann sagen, wo es eigentlich hin sollte: nämlich in den Application Data Ordner des jeweiligen Benutzers. Auf jeden Fall ist die Preferences API das was man sich anschauen sollte.
java.util.prefs nutzt per default die Registry unter Windows, was ich schonmal doof finde. :tongue: Es gibt zwar Erweiterungen mit Dateien statt der Registry (http://www.koders.com/java/fid87CFEDED5EF625BA4E027A32E375B1E96656BAFA.aspx) aber ich werd erstmal mit org.apache.commons.configuration rumspielen.

Es ging mir weniger ums Format, sondern eher darum, wo das denn nun gespeichert wird. Ich kann mich daran erinnern, im Usenet (ja, das gibt es noch) in der Gruppe de.comp.lang.java erst kürzlich einen Thread überlesen zu haben, wo auch behandelt wurde, weshalb man ohne Zugriff auf die Registry nicht zuverlässig bzw. Windows-konform herauskriegen kann, wo die Einstellungs-Datei hin soll, wenn man denn eine eigene schreiben will.

commons-configuration ist tatsächlich eine sehr elegante Lösung, aber auch das hat nichts parat, dir mitzuteilen, wo die Datei dem OS gemäss liegen sollte. Das geht eigentlich nur mit Native-Code, der das vorbereitet, wobei es gewisse OSs gibt, bei denen sich solcher “Native-Code” mit Scripts abdecken lässt.

Sephiroth
2009-05-15, 00:16:54
user.home gibt es auch unter Windows. Ich hab mich aber dazu entschlossen die Umgebungsvariable APPDATA unter Windows zu verwenden und unter Linux user.home.

Abnaxos
2009-05-15, 00:43:15
Und das wäre dann der Thread, in dem auch behandelt wird, warum diese Idee nicht gut sein soll (http://groups.google.com/group/de.comp.lang.java/browse_frm/thread/f783572f693263b/7566fd5f038e5583?q=java+unter+vista+group:de.comp.lang.java[/url).

Edit: Sorry, habe jetzt doch noch weiter gelesen, und APPDATA scheint durchaus OK zu sein.

Flolle
2009-05-15, 01:49:11
Es gäbe noch die Möglichkeit, Properties (http://java.sun.com/javase/6/docs/api/java/util/Properties.html) zu benutzen. Das ist mehr oder weniger einfach nur ein recht simpler ini-Datei Wrapper (oder XML bei Bedarf). Ist aber nicht unbedingt die eleganteste Methode und die Klasse ist schon was älter was man ihr auch anmerkt (die Preferences-API wurde nicht umsonst als Ersatz entwickelt). Sollte seinen Zweck tun wenn man nur ein paar Einstellungen speichern möchte, ansonsten wird es wohl doch ein wenig zu unhandlich.

Ganon
2009-05-15, 08:14:43
Es ist unhandlich :D

Monger
2009-05-15, 08:20:33
Ich glaube, um irgendwelche Programmeinstellungen zu speichern, ist es gehüpft wie gesprungen ob Plain Text oder XML. Ob das in 0,002 oder 0,000343 Sekunden eingelesen wurde, das bemerkt der Nutzer nicht wirklich. ;)
Der Unterschied dürfte weit geringer sein. Die Zugriffszeit für die Festplatte wird immer der Flaschenhals sein. Sagen wir mal, die liegt jetzt bei 20ms (frei aus der Luft gegriffen), und dann ist es wirklich egal ob ich 0,02005s oder 0,02010s brauche. Jeder moderne Textparser ist um ein vielfaches schneller als der Festplattenzugriff. VIEL, viel schneller.

Shink
2009-05-15, 08:24:56
Naja, bei einfachen Sachen find ich Properties (alleine da einfach und fertig implementiert seit Java 1 mit dabei) wirklich ganz brauchbar, man muss das Problem ja nicht größer machen als es ist.

Ansonsten wie gesagt Apache Commons Configuration: Damit liest und schreibt man aus und in Property-, XML-, INI-Dateien oder auch Datenbank auf die selbe Weise.

Sephiroth
2009-05-18, 23:47:11
Der Vollständigkeit halber: javaregistrywrapper (http://code.google.com/p/javaregistrywrapper/) - Java Wrapper for Accessing Windows Registry

Benutzt java.util.prefs.Preferences und verschafft sich über Reflect Zugriff auf die privaten Methoden. :ugly:

Werte für die Reg Hives sind

+#define HKEY_CLASSES_ROOT 0x80000000
+#define HKEY_CURRENT_USER 0x80000001
+#define HKEY_LOCAL_MACHINE 0x80000002
+#define HKEY_USERS 0x80000003
+#define HKEY_PERFORMANCE_DATA 0x80000004
+#define HKEY_CURRENT_CONFIG 0x80000005
+#define HKEY_DYN_DATA 0x80000006
+#define HKEY_PERFORMANCE_TEXT 0x80000050
+#define HKEY_PERFORMANCE_NLSTEXT 0x80000060

Shink
2009-05-19, 10:07:36
Der Vollständigkeit halber: javaregistrywrapper (http://code.google.com/p/javaregistrywrapper/) - Java Wrapper for Accessing Windows Registry

Funktioniert das auch unter Linux und MacOS?:wink: