Preferences in Datei umleiten

antimon

Mitglied
Hallo zusammen,

ich würde gerne projektspezifische Einstellungen über Preferences managen - allerdings werden die meines Wissens nach im Falle von Windows in der Registry abgelegt.

Zwar kann ich einen Teil des Baums importieren oder exportieren, aber die Speicherbasis bleibt die Registry (korrigiert mich bitte falls ich falsch liege).

Gibt es eine einfache Möglichkeit, die kompletten Einstellungen in eine (XML-)Datei umzuleiten, die dann in meinem Projektordner gespeichert wird, damit dort und nur dort die Einstellungen abgelegt sind?

Denn ich würde gern portable Anwendungen erstellen, die dann die Einstellungen auch auf anderen PCs verwenden können...
 
Hallo,

welche Preferences meinst du genau?
- IDE (Eclipse) Einstellungen werden in einer .project Datei im Projektordner abgelegt.
- fachliche Programmeinstellungen können dort untergebracht werden wo man es für am sinnvollsten hält.
- Virtual Machine Preferences kann man beim Aufruf eines Javaprogrammes als Parameter übergeben, ablegbar in einer batch-Datei oder einem Manifest.

Zu dem Stichpunkt fachliche Programeinstellungen (hostnamen, loglevel, was man auch immer gern ausserhalb konfigurieren möchte) ist wie du schon sagst, die Windows Registry kein gutes Mittel, Stichwort Portabilität. Portabler und auch sicher einfacher im Umgang ist da deine Idee mit einer Konfigurationsdatei.
Hierzu gibt es im Javaumfang schon etwas fertiges
http://de.wikipedia.org/wiki/Java-Properties-Datei. Vielleicht trifft das genau dein Verwendungszweck.

XML in der Preferencesdatei. Dazu würde ich die Anwort von Thomas hier mal anschauen http://www.tutorials.de/java/240602-properties-lesen-via-xml.html.

Dies ist zumindest meine Interpretation von Preferences.
 
Hallo,

ich denke er meint java.util.prefs.Preferences. Wobei Josh Bloch ( der Author ) AFAIK schon selbst gesagt hat, dass das Preferences API eines des am ungünstigsten zu benutzenden (und nicht zuletzt deswegen zu den am wenigsten benutzten) APIs gehört.

Wenn du nur einfache Schlüssel-/Wertpaare speichern möchtest würde ich an deiner Stelle nur java.util.Properties verwenden. Die kannst du als normale TextDateien oder im XML Format ablegen.

Eine andere Möglichkeit wäre deine Einstellungen in einer eigenen Objektstruktur zu definieren welche du dann über den XMLEncoder schreiben und XMLDecoder wieder auslesen kannst.
Java:
package de.tutorials;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class PreferencesExample {
	public static void main(String[] args) throws Exception{
		String configFile = "c:/temp/config.xml";
		Config config = ...;
		
		//Speichern im XML Format
		new XMLEncoder(new FileOutputStream(configFile)).writeObject(config);
		
		//Lesen in Objektstruktur
		config = (Config)new XMLDecoder(new FileInputStream(configFile)).readObject();
		//...
	}

}

Gruß Tom
 
Oh sorry, ich dachte die Preferences haben alle eine gemeinsame Basis...

Es geht um die Eclipse Preferences, wie Lars sie in seinem Tutorial verwendet: http://www.vogella.de/articles/EclipsePreferences/article.html

Sympathisch daran ist mir, dass das Handling damit recht einfach ist - der Activator selektiert bereits den passenden Pfad für die Einstellungen, in den PreferencePages kann man mit sehr wenig Code viel erreichen.

Allerdings habe ich dazu noch nichts gefunden, wie ich den Speicherort der Datei verändern bzw. einen Teil der Einstellungen in eine andere Datei speichern kann...

@Tom: wusste gar nicht dass es einen Zweizeiler gibt, der Objekte als XML speichern kann, das muss ich mir merken! JAXB kenne ich zwar, aber das ist für bestimmte Key/Value-Paare eher ungeeignet...

Zur storeToXML()-Methode aus dem verlinkten Beitrag: Wie ist das dann bei den Eclipse Preferences - werden die dann wirklich nur in der angegebenen Datei gespeichert oder ist das quasi eine Export-Funktion, die die Preferences _zusätzlich_ in der XML-Datei speichert?
 
Eclipse ist ja bloss ein IDE. D.h. zum laufen lassen des Programmes, würde man kein Eclipse vorsehen sondern ein Start über jar oder Kommandozeile, sodass das Programm ohne externe Werkzeuge wie ein IDE funktioniert.
Werte in einer txt oder xml Datei zu pflegen befinde ich nicht als unkomfortabler als sie über den Preferences Dialog zu pflegen.
Nur was eclipse unbedingt an Einstellungen braucht um das Programm dort zu betreiben würde ich in den EclipsePreferences ablegen, sowas wie, ProjectReference, Classpath. Alles andere würde ich in die zusätzliche txt oder xml Datei legen. Dies hat den Vorteil, dass man auch ohne x-server mal schnell in die Properties reinschauen oder was ändern kann.
Das ist mit wenig Code zu erledigen, ist übersichtlich, schnell und intuitiv.

Ich würde etwas in folgender Art verwenden:
Code:
package de.tutorials;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PreferencesSample {
	public PreferencesSample() throws IOException {
		Properties p = new Properties();
		InputStream is = getClass().getResourceAsStream("prop.txt");
		p.load(is);
		// p.loadFromXML(is);
		System.out.println(p.get("myKey"));
	}

	public static void main(String[] args) {
		try {
			new PreferencesSample();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
Dabei liegt dann eine Datei mit Namen "prop.txt" im selben Ordner wie die Klasse in der man dies ausführt, kann man also in ein Jar mit reinpacken. Inhalt in diesem Fall ist:
Code:
myKey=myValue
 
Jo, Eclipse ist eine IDE, aber mit Eclipse ist ja auch nichts weiter als ein Haufen Plugins, die auf dem Eclipse RCP Framework aufbauen... und da ist ja der Vorteil, dass einiges an Code und damit Arbeit abgenommen werden kann.
Sicher, für bestimmte Dinge ist eine Properties-Datei recht praktisch, aber wenn ich eine Einstellung editierbar machen möchte, brauch ich Label, Textfield oder anderes, muss dieses auslesen, prüfen und dann als Preference-Wert ablegen und zu guter Letzt die Preferences speichern.
Über Eclipse RCP brauche ich nur z.B. einen StringFieldEditor mit dem Namen der Preference in einer Properties Page einbinden und gut ists.
So wie hier: http://www.silke-schlueter.de/de/rcp/preferences.htm

Es geht halt schon um eine umfangreiche Software mit GUI, für eine (Server-)Konsolenapplikation würde ich Properties verwenden, die ich mit nem Texteditor bearbeite... aber die Werte sollen halt auch Endanwender einfach bearbeiten können...
 

Neue Beiträge

Zurück