2012-04-19 20 views
7

Estoy usando java.util.prefs.Preferences para las preferencias de la aplicación. Y necesito la capacidad de editar esas preferencias manualmente. ¿Es posible almacenarlo en archivos en lugar de en el Registro de Windows? O debería usar otro mecanismo en lugar de java.util.prefs.Preferences?cómo almacenar java.util.prefs.Preferences en el archivo?

+0

[java.util.Properties] (http://download.oracle.com/javase/tutorial/essential/environment/properties.html) tal vez? Aunque tiene menos grano fino que las Preferencias. – BalusC

+0

Supongo que aún no ha recurrido a [Javadoc] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/prefs/Preferences.html). Hazlo y ver si todavía tienes algo que preguntar. –

+2

@MarkoTopolnik quería decir "Estos datos se almacenan de forma persistente en una tienda de respaldo dependiente de la implementación.Las implementaciones típicas incluyen archivos planos, registros específicos del sistema operativo, servidores de directorio y bases de datos SQL. ** El usuario de esta clase no necesita preocuparse por los detalles de la tienda de respaldo. ** "??? – denys

Respuesta

6

Si desea seguir utilizando la API de preferencias, pero escribir en un archivo, se necesita una nueva PreferencesFactory, como se detalla en this SO post.

0

Se explica en otro post, here

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

lo siento - No es lo mismo. [Comparación de la API de preferencias con otros mecanismos] (http://docs.oracle.com/javase/1.5.0/docs/guide/preferences/index.html#prefs-other). En Windows hay son dos lugares donde se pueden colocar las preferencias. Registro o% APPDATA%. Fe en QSettings (Qt Framework) Podría seleccionar entre esas 2 opciones ... – denys

+2

Lo siento, he entendido mal. ¿Qué pasa con eso? No pude probar pero parece wh a quien estás buscando http://www.davidc.net/programming/java/java-preferences-using-file-backing-store –

+0

Mucho mejor. Gracias, @MEK. – denys

5

usted va a querer utilizar el método de dos siguientes:

Preferences.exportSubtree(OutputStream os) 

y

Preferences.importPreferences(InputStream is) 
0

Creo que se puede utilizar archivos de propiedades en su lugar. Se almacenan en el sistema de archivos. Puede definir la ruta que desea. Y puedes editarlo a mano. Ver this question para más detalles.

2

Este código debe ayudarle 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

Hace un tiempo tuve que subir con una implementación de la Clase de preferencias que leería configuraciones de, pero no escribiría en el registro. Obtuve una clase ReadOnlyPreferences de AbstractPreferences para lograr esto. Más tarde, necesité esta misma funcionalidad exacta que necesita para ir a/desde archivos. Acabo de extender mi clase ReadOnlyPreferences para anular Sync() y flush() para mantener el archivo sincronizado. La mejor parte de esto sería utilizar la misma lógica para aplicar valores predeterminados a los valores, al igual que el uso habitual de las preferencias, ya que en realidad no existía nada en el registro para leer. Mantuve el archivo sincronizado usando exportSubtree() e importPreferences() de la clase base para hacer todo el trabajo pesado por mí.

Lo siento, no puedo publicar el código ya que no lo tengo, pero utilicé las preferencias cifradas que puede encontrar en el siguiente enlace como punto de inicio. Eso es lo que hice y me tomó alrededor de una hora destilarlo a justo lo que necesitaba, lo que principalmente era arrojar código, ¡que es mucho más fácil que escribir código! También se publica en el Dr. Dobbs en el siguiente enlace si no desea hacer clic en el primero. Nunca vi un lugar fácil en el artículo dobbs para descargar toda la fuente. De todos modos, el artículo es el mejor que he visto para ampliar las preferencias.

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

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

-1

Prueba la siguiente clase, que le permite utilizar algunas simples put() y get() funciones usando un archivo local 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); 
    } 
} 
Cuestiones relacionadas