2012-04-19 12 views
7

Ich verwende java.util.prefs.Preferences für die Anwendungspräferenzen. Und ich muss diese Einstellungen manuell bearbeiten können. Ist es möglich, es in der Datei statt in der Windows-Registrierung zu speichern? Oder sollte ich einen anderen Mechanismus anstelle von java.util.prefs.Preferences verwenden?Wie java.util.prefs.Preferences in Datei speichern?

+0

[java.util.Properties] (http://download.oracle.com/javase/tutorial/essential/environment/properties.html) vielleicht? Es ist jedoch weniger feinkörnig als die Voreinstellungen. – BalusC

+0

Ich vermute, Sie haben noch nicht auf [Javadoc] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/prefs/Preferences.html) zurückgegriffen. Tun Sie es und sehen Sie, ob Sie noch etwas zu fragen haben. –

+2

@MarkoTopolnik Sie meinten "Diese Daten werden dauerhaft in einem implementierungsabhängigen Backing Store gespeichert.Typische Implementierungen umfassen flache Dateien, betriebssystemspezifische Register, Verzeichnisserver und SQL-Datenbanken. ** Der Benutzer dieser Klasse muss sich nicht um Details des Backing Stores kümmern. ** "??? – denys

Antwort

6

Wenn Sie die Einstellungen API fortsetzen wollen, sondern in eine Datei zu schreiben, müssen Sie einen neuen PreferencesFactory, wie in this SO post beschrieben.

0

Es wird in einem anderen Beitrag erklärt, here

Properties prop = new Properties(); 
InputStream in = getClass().getResourceAsStream("foo.properties"); 
prop.load(in); 
in.close() 
+0

Entschuldigung - Es ist nicht das gleiche. [Vergleichen Einstellungen API zu anderen Mechanismen] (http://docs.oracle.com/javase/1.5.0/docs/guide/preferences/index.html#prefs-other). In Windows dort Es gibt zwei Orte, an denen Präferenzen platziert werden könnten: Registry oder% APPDATA% Fe in QSettings (Qt Framework) Ich könnte zwischen diesen beiden Optionen wählen ... – denys

+2

Entschuldigung, ich habe es falsch verstanden, was ist das? Ich konnte es nicht testen, aber es scheint wh wonach du suchst. http://www.davidc.net/programming/java/java-preferences-using-file-backing-store –

+0

Viel besser. Danke, @MEK. – denys

5

Sie werden die folgenden zwei Verfahren verwenden wollen:

Preferences.exportSubtree(OutputStream os) 

und

Preferences.importPreferences(InputStream is) 
0

Ich glaube, Sie Eigenschaftsdateien verwenden können, statt. Sie sind im Dateisystem gespeichert. Sie können den gewünschten Pfad definieren. Und Sie können es von Hand bearbeiten. Weitere Informationen finden Sie unter this question.

2

sollten Dieser Code hilft Ihnen [http://java.sun.com/developer/technicalArticles/releases/preferences/]:

public class PrefSave { 

private static final String PACKAGE = "/pl/test"; 

public static void main(String[] args) { 
    doThings(Preferences.systemRoot().node(PACKAGE)); 
    doThings(Preferences.userRoot().node(PACKAGE)); 
} 

public static void doThings(Preferences prefs) { 
    prefs.putBoolean("Key0", false); 
    prefs.put("Key1", "Value1"); 
    prefs.putInt("Key2", 2); 

    Preferences grandparentPrefs = prefs.parent().parent(); 
    grandparentPrefs.putDouble("ParentKey0", Math.E); 
    grandparentPrefs.putFloat("ParentKey1", (float) Math.PI); 
    grandparentPrefs.putLong("ParentKey2", Long.MAX_VALUE); 

    String fileNamePrefix = "System"; 
    if (prefs.isUserNode()) { 
     fileNamePrefix = "User"; 
    } 
    try { 
     OutputStream osTree = new BufferedOutputStream(
       new FileOutputStream(fileNamePrefix + "Tree.xml")); 
     grandparentPrefs.exportSubtree(osTree); 
     osTree.close(); 

     OutputStream osNode = new BufferedOutputStream(
       new FileOutputStream(fileNamePrefix + "Node.xml")); 
     grandparentPrefs.exportNode(osNode); 
     osNode.close(); 
    } catch (IOException ioEx) { 
     // ignore 
    } catch (BackingStoreException bsEx) { 
     // ignore too 
    } 
} 
0

Vor einiger Zeit hatte ich mit einer Implementierung der kommen Präferenzklasse, die Einstellungen von der Registrierung liest, aber nicht in die Registrierung schreibt. Ich habe eine ReadOnlyPreferences-Klasse von AbstractPreferences abgeleitet, um dies zu erreichen. Später benötigte ich genau diese Funktionalität, die Sie benötigen, um zu/von Dateien zu gehen. Ich habe gerade meine ReadOnlyPreferences-Klasse erweitert, um sync() und flush() zu überschreiben, um die Datei synchron zu halten. Der coole Teil dazu würde genau die gleiche Logik verwenden, um Standardwerte auf die Werte anzuwenden, genau wie die übliche Verwendung der Präferenzen, da in der Registrierung tatsächlich nichts zum Lesen existierte. Ich habe die Datei synchron gehalten, indem ich exportSubtree() und importPreferences() von der Basisklasse verwendet habe, um all das schwere Heben für mich zu erledigen.

Es tut mir leid, dass ich den Code nicht posten kann, da ich ihn nicht besitze, aber ich habe die verschlüsselten Einstellungen verwendet, die Sie unter dem folgenden Link als Ausgangspunkt finden können. Das habe ich gemacht und ich brauchte ungefähr eine Stunde, um es auf genau das zurückzuführen, was ich brauchte und hauptsächlich Code wegwarf, was viel einfacher ist, als Code zu schreiben! Es wird auch in Dr. Dobbs unter dem folgenden Link veröffentlicht, wenn Sie nicht auf den ersten klicken möchten. Ich habe nie einen einfachen Platz auf dem Dobbs-Artikel gesehen, um die gesamte Quelle herunterzuladen. Egal, der Artikel ist der beste, den ich gesehen habe, um die Vorlieben zu erweitern.

http://www.panix.com/~mito/articles/#ep

http://www.drdobbs.com/security/encrypted-preferences-in-java/184416587?pgno=4

-1

die folgende Klasse Versuchen Sie, die Sie einige einfache put() und get() Funktionen mit einer lokalen configuration.xml Datei verwenden.

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.InvalidPropertiesFormatException; 
import java.util.Properties; 

public class SimpleProperties 
{ 
    private String propertiesFilePath; 
    private Properties properties; 

    public SimpleProperties() throws InvalidPropertiesFormatException, IOException 
    { 
     propertiesFilePath = "configuration.xml"; 
     properties = new Properties(); 

     try 
     { 
      properties.loadFromXML(new FileInputStream(propertiesFilePath)); 
     } catch (InvalidPropertiesFormatException e) 
     { 

     } 
    } 

    public void put(String key, String value) throws FileNotFoundException, IOException 
    { 
     properties.setProperty(key, value); 

     store(); 
    } 

    public String get(String key) 
    { 
     return properties.getProperty(key); 
    } 

    private void store() throws FileNotFoundException, IOException 
    { 
     String commentText = "Program parameters"; 

     properties.storeToXML(new FileOutputStream(propertiesFilePath), commentText); 
    } 
}