# Speichern von Einstellungen



## mabuhay (1. Mai 2010)

Hallo

Ich habe ein paar generelle Fragen zum Speichern von Einstellungen einer Java-Applikation. Ich habe schon etliche Posts über Relative Pfade etc. durchgeschaut, aber die richtige Antwort noch nicht gefunden.

Also das naheliegendste ist ja eine Datei im gleichen Ordner der .jar-Datei zu Speichern. Eine zweite Möglichkeit ist im Home-Verzeichnis des Benutzers (z.B. /home/user/.javaapp bei Linux) oder irgendwo in C:/Dokumente und Einstellungen/user bei Windows (bei Mac kenne ich mich nicht aus).

Das Speichern einer Datei im gleichen Ordner wie die .jar-Datei ist scheinbar nicht ganz einfach, da der Pfad zur .jar nicht einfach so zu ermitteln ist (kommt ja immer darauf an von wo aus die .jar ausgeführt wurde -> arbeitspfad). Es wäre aber Praktisch da die Einstellungen somit auch einfach gelöscht werden können wenn die .jar gelöscht wird.

Das Speichern einer Datei unter /home/user oder wo auch immer in Windows ist da einfacher da der Pad ja per user.dir ermittelt werden kann. Aber bei Windows bekomme ich mit user.dir z.B. C:\Documents and Settings\user, möchte die Einstellungen aber in C:\Documents and Settings\Application Data Speichern. Einfach den Pfad anzugeben geht nicht, da es beim englischen Windows ja anders heisst als beim deutschen.
Wenn ich nun die Einstellungen an einem solchen Ort Speichere und die .jar lösche, liegen die Einstellungen ja immer noch irgendwo rum, was nicht so schön ist.

Wie löst ihr das normalerweise mit Konfigurationsdateien? wo und wie Speichert ihr die?

mfg


----------



## Wildcard (1. Mai 2010)

Einfacher ist es oft überhaupt nicht mit Dateien zu arbeiten, sondern den Java Preference Store zu benutzen. Brauchst du denn zwingend Dateien?


----------



## mabuhay (1. Mai 2010)

Nein, eigentlich brauche ich keine Dateien. Habe gar nicht gewusst dass es eine solche Möglichkeit ohne Datein in Java gibt. Ich verwende auch java.util.prefs.Preferences, lade und schreibe die aber immer aus/in eine Datei.

Habe hier eine Beschreibung gefunden: Preferences : Java Glossary

Wie ist das dann genau mit diesen Preferences? Die werden dann immer dort gespeichert bleiben? muss man die auch irgendwann löschen oder können die auch immer dort bleiben, also zum Beispiel wenn das Java-programm gar nicht mehr verwendet wird? Irgendwie sammelt sich da dann ja all der Müll an von Einstellungen nicht mehr verwendeter Programme.

mfg


----------



## nixnick (1. Mai 2010)

ich verwende dazu sehr gerne die methode loadFromXML aus Properties:


```
Properties settings;

public void readSettings()
    {
        try {
            File file = new File("settings.xml");
            if(file.canRead())
            {
                try{
                    settings.loadFromXML(new FileInputStream(file));
                } catch(java.util.InvalidPropertiesFormatException e)
                {
                    readDefaultConfig();
                    saveSettings();
                }
            } else {
                if(file.exists())
                {
                    System.out.println("ERROR: CANNOT READ CONFIG FILE");
                } else {
                    file.createNewFile();
                }
            }
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
    public void saveSettings()
    {
        try {
            File file = new File("settings.xml");
            if(file.canRead())
            {
                file.delete();
                settings.storeToXML(new FileOutputStream(file), null);
            } else {
                System.out.println("ERROR: CANNOT READ CONFIG FILE");
            }
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }
```
großer vorteil: diese methoden erstellen eine datei settings.xml im verzeichnis der jar, welche sehr übersichtlich und auch gut manuell zu bearbeiten ist.
man kann sie natürlich auch noch woanders hinschieben:
[JAVA=6]
File file = new File(System.getProperty("user.home")+"/settings.xml");
[/code]


----------



## mabuhay (1. Mai 2010)

Das ist eben genau mein Problem. Dein Beispiel mit 
	
	
	
	





```
File file = new File("settings.xml");
```
 Speichert nur dann im Ordner des .jar-Files, wenn es auch dort gestartet wurde. 
Linux als beispiel: Doppelklick auf die .jar-Datei würde deine settings.xml im Verzeichnis /home/user speichern (da dies der Arbeitspfad ist)
in der Konsole: cd auf /home/user/javaapp/ und dann java -jar ./javaapp.jar würde die Datei im Ordner der .jar speichern, da dies nun der Arbeitspfad ist
und das Beispiel mit user.home ist auch nicht unbedingt schön wenn der Benutzer plötzlich einfach Konfigurationsdateien im home-Verzeichnis liegen hat.

Gibt es eigentlich bestimmte Gründe dass es nicht möglich ist, den Pfad zur .jar herauszubekommen? Ausser dem Arbeitspfad habe ich noch nichts gefunden.

mfg


----------



## faetzminator (1. Mai 2010)

mabuhay hat gesagt.:


> und das Beispiel mit user.home ist auch nicht unbedingt schön wenn der Benutzer plötzlich einfach Konfigurationsdateien im home-Verzeichnis liegen hat.



Öhm, das ist normal. Ich hab ~60 Dateien in [c]~[/c] beginnend mit [c].[/c]. Als Standardbeispiel z.B. [c]~/.bashrc[/c].
Natürlich solltest du die Datei dann [c].<programmname>-config[/c] o.ä. nennen.


----------



## faetzminator (1. Mai 2010)

*ups*


----------



## Wildcard (1. Mai 2010)

Der Java Preference Store schreibt je nach OS an unterschiedliche Stellen. Kann eine Windows Registry sein, eine Datenbank, Dateien, du brauchst dich nicht darum kümmern.
Löschen kannst du die Einträge natürlich auch, dann brauchst du aber eine Art uninstaller.
Das Problem hast du aber mit jeder Art von User spezifischen Settings. Der Uninstaller muss von einem Account mit root/admin rechten ausgeführt werden und du musst theoretisch die Einstellungen aller User löschen wenn du es sauber machen willst.
In der Praxis lässt man User Settings daher auch einfach auf dem System und solange du nur ein paar Settings ablegst fällt das auch gar nicht ins Gewicht.


----------



## JohannisderKaeufer (1. Mai 2010)

mabuhay hat gesagt.:


> Also das naheliegendste ist ja eine Datei im gleichen Ordner der .jar-Datei zu Speichern.



Damit würdest du keine Freude haben. 
Die jar gehört an und für sich unter windows in crogramme unter Linux bspw. /opt.

Um Programme zu installieren werden Administrationsrechte bzw. root-Rechte benötigt. Unter Vista hieß das mal UAC.
Und diese Rechte sorgen unter anderem dafür, das man für diese Ordner in der Regel keine Schreibrechte hat. 

Wenn du nun in diesen Verzeichnissen, deine Konfigurationen oder Nutzdaten ablegen möchtest, dann wirst du mit den Betriebssysteminternen Sicherheitsmaßnahmen bekanntschaft machen. Unter Windows XP mag das vielleicht noch nicht so auffallen, da man da Standardmäßig eh als Admin unterwegs ist:autsch:, aber ab Vista wirds deutlich.


----------



## mabuhay (2. Mai 2010)

faetzminator hat gesagt.:


> Öhm, das ist normal. Ich hab ~60 Dateien in [c]~[/c] beginnend mit [c].[/c]. Als Standardbeispiel z.B. [c]~/.bashrc[/c].
> Natürlich solltest du die Datei dann [c].<programmname>-config[/c] o.ä. nennen.



Ja das ist mir klar. Nur wäre es dann ein wenig kompliziert dass bei Windows und Mac die Dateien am richtigen Ort gespeichert werden (oder gibt es etwas wie user.home welches den Pfad zu C:\Documents and Settings\user\Application Data\ oder so herausgibt? Wäre nützlich wegen unterschiedlicher Systemsprachen.)



JohannisderKaeufer hat gesagt.:


> Damit würdest du keine Freude haben.
> Die jar gehört an und für sich unter windows in crogramme unter Linux bspw. /opt.
> 
> Um Programme zu installieren werden Administrationsrechte bzw. root-Rechte benötigt. Unter Vista hieß das mal UAC.
> ...



Hmm, ja da hast du recht, da würde es dann Probleme geben.


Vielen Dank für alle Antworten. Ist mir nun einiges klar geworden 

mfg


----------



## Wortraum (2. Mai 2010)

mabuhay hat gesagt.:


> Nur wäre es dann ein wenig kompliziert dass bei Windows und Mac die Dateien am richtigen Ort gespeichert werden (oder gibt es etwas wie user.home welches den Pfad zu C:\Documents and Settings\user\Application Data\ oder so herausgibt? Wäre nützlich wegen unterschiedlicher Systemsprachen.)


Was ist denn an ~ respektive %HOMEPATH% falsch? Gimp, Jedit oder Netbeans nutzen beispielsweise auch %HOMEPATH% unter Windows.

Wenn Du etwas in %APPDATA% speichern willst, kannst Du den Pfad über die Umgebungsvariable abfragen, etwa so:

```
String configPath = System.getenv("APPDATA");
if (configPath == null) {
    configPath = System.getProperty("user.home");
}
```


----------



## mabuhay (2. Mai 2010)

Wortraum hat gesagt.:


> Was ist denn an ~ respektive %HOMEPATH% falsch? Gimp, Jedit oder Netbeans nutzen beispielsweise auch %HOMEPATH% unter Windows.



Da ist natürlich nichts falsch daran. Habe nur noch nach einer (einheitlichen) Lösung für Windows, Mac und Linux gesucht. Wie würde ich dann für Mac and den Pfad zu den Programmeinstellungen kommen? Sind da die daten auch im home-Verzeichnis gespeichert mit vorangestellem "." (punkt)?
Danke für den Hinweis auf die Umgebungsvariable %APPDATA%. Schade gibt es da keine einheitliche Lösung gibt...

mfg


----------



## nocxsville (3. Mai 2010)

Eine kleine Anmerkung zu Preferences. Unter Windows Vista / 7 gibt es Probleme, wenn die Anwendung nicht als Administrator ausgeführt wird. Bei Setzen einer preference wird eine Exception geworfen. Dazu gibt es bereits einen Fehlereintrag.

Grüße
nocxsville


----------



## mabuhay (3. Mai 2010)

Thx. Machs jetzt aber mit Dateien. Ist mir irgendwie lieber wenn ich weiss wo die Datei liegt, als wenns einfach irgendwo gespeichert wird.

mfg


----------

