2012-04-19 14 views
7

Sto usando java.util.prefs.Preferenze per le preferenze dell'applicazione. E ho bisogno di modificare manualmente queste preferenze. È possibile archiviarlo in un file anziché nel registro di Windows? Oppure dovrei usare un altro meccanismo invece di java.util.prefs.Preferences?come memorizzare java.util.prefs.Preferenze nel file?

+0

[java.util.Properties] (http://download.oracle.com/javase/tutorial/essential/environment/properties.html) forse? Tuttavia è meno raffinato di Preferenze. – BalusC

+0

Immagino che tu non abbia ancora fatto ricorso a [Javadoc] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/prefs/Preferences.html). Fallo e vedi se hai ancora qualcosa da chiedere. –

+2

@MarkoTopolnik intendevi "Questi dati sono archiviati in modo persistente in un backing store dipendente dall'implementazione.Le implementazioni tipiche includono file flat, registri specifici del sistema operativo, server di directory e database SQL. ** L'utente di questa classe non deve preoccuparsi dei dettagli del backing store. ** "??? – denys

risposta

6

Se si desidera continuare a utilizzare l'API Preferenze, ma scrivere in un file, è necessario un nuovo PreferencesFactory, come dettagliato nella this SO post.

0

E 'spiegato in un altro post, here

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

sorry - non è la stessa cosa [Confronto tra l'API delle preferenze e altri meccanismi] (http://docs.oracle.com/javase/1.5.0/docs/guide/preferences/index.html#prefs-other). sono due posti in cui è possibile inserire le preferenze Registro o% APPDATA%. Fe in QSettings (Qt Framework) Potrei selezionare tra queste 2 opzioni ... – denys

+2

Scusa, ho frainteso. Che dire? Non ho potuto testare ma sembra wh stai cercando. http://www.davidc.net/programming/java/java-preferences-using-file-backing-store –

+0

Molto meglio. Grazie, @MEK. – denys

5

avete intenzione di voler utilizzare i due seguente metodo:

Preferences.exportSubtree(OutputStream os) 

e

Preferences.importPreferences(InputStream is) 
0

Penso che si possa utilizzare i file di proprietà, invece. Sono memorizzati nel file system. Puoi definire il percorso che desideri. E puoi modificarlo a mano. Vedi this question per maggiori dettagli.

2

Questo codice dovrebbe aiutare a [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

Qualche tempo fa ho dovuto trovare un'attuazione del Classe di preferenze che legge le impostazioni ma non scrive nel registro. Ho ottenuto una classe ReadOnlyPreferences da AbstractPreferences per realizzare questo. In seguito, avevo bisogno di questa stessa identica funzionalità richiesta per andare da/ai file. Ho appena esteso la mia classe ReadOnlyPreferences per sovrascrivere sync() e flush() per mantenere il file sincronizzato. La parte interessante di questo sarebbe utilizzare la stessa logica per applicare i valori predefiniti ai valori proprio come il solito uso dei prefs poiché in realtà non esisteva nulla nel registro da leggere. Ho mantenuto il file sincronizzato usando exportSubtree() e importPreferences() dalla classe base per fare tutto il lavoro pesante per me.

Mi dispiace, non posso pubblicare il codice perché non lo possiedo, ma ho utilizzato le informazioni sulle preferenze crittografate che puoi trovare al seguente link come punto di partenza. Questo è quello che ho fatto e mi ci è voluta circa un'ora per distillarlo in base a ciò di cui avevo bisogno, il che significava principalmente buttare via il codice che è molto più semplice della scrittura del codice! È anche pubblicato in Dr Dobbs al seguente link se non si desidera fare clic sul primo. Non ho mai visto un posto facile nell'articolo di dobbs per scaricare l'intera fonte. Indipendentemente da ciò, l'articolo è il migliore che ho visto per estendere le cose delle preferenze.

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

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

-1

Prova la seguente classe, che consente di utilizzare alcuni semplici put() e get() funzioni utilizzando un file locale configuration.xml.

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); 
    } 
} 
Problemi correlati