2009-02-19 6 views
32

Aunque java.util.properties permite leer y escribir archivos de propiedades, la escritura no conserva el formato. No es sorprendente, porque no está vinculado al archivo de propiedades.¿Una clase mejor para actualizar los archivos de propiedades?

¿Hay una clase de PropertyFile por ahí, o algo así, que conserva los comentarios y las líneas en blanco y actualiza los valores de las propiedades en su lugar?

Respuesta

44

No hay nada mejor que Apache's Commons Configuration API. Esto proporciona un enfoque unificado para la configuración desde los archivos de propiedades, XML, JNDI, fuentes de datos JDBC, etc.

Su manejo de archivos de propiedad es muy bueno. Le permite generar un objeto PropertiesConfigurationLayout desde su propiedad que conserva la mayor cantidad de información posible sobre su archivo de propiedad (espacios en blanco, comentarios, etc.). Cuando guarde los cambios en el archivo de propiedades, estos se conservarán de la mejor manera posible.


Código de ejemplo:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.InputStreamReader; 

import org.apache.commons.configuration.ConfigurationException; 
import org.apache.commons.configuration.PropertiesConfiguration; 
import org.apache.commons.configuration.PropertiesConfigurationLayout; 

public class PropertiesReader { 
    public static void main(String args[]) throws ConfigurationException, FileNotFoundException { 
     File file = new File(args[0] + ".properties"); 

     PropertiesConfiguration config = new PropertiesConfiguration(); 
     PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config); 
     layout.load(new InputStreamReader(new FileInputStream(file))); 

     config.setProperty("test", "testValue"); 
     layout.save(new FileWriter("path\\to\\properties\\file.properties", false)); 
    } 
} 

Ver también:

+0

Eso funciona muy bien y guarda los comentarios allí. Se tomó la libertad de agregar algún código de muestra :) –

+7

El código proporcionado no se compila ... propsFile no está declarado – blank

+0

¿Qué sucede si tiene un valor clave como Spring.Names = cookie @! Jar @! Johnson @! James @! Green @!Patricio. ¿Cómo agregarías "Jimmy" después de patrick? – Jesse

6

Puede echarle un vistazo al Apache Commons Configuration, que contiene la clase PropertiesConfiguration. Sin embargo, ya que nunca he usado, no sé si preserva los comentarios y formato ...

Sin embargo, worthes una oportunidad ...

+0

Según los documentos, una clase "PropertiesConfigurationLayout" conservará el formato y los comentarios. –

0

una vez vi una clase para hacer esto con archivos INI pero ya no puede encontrar el enlace. Si no puede encontrar nada más, puede intentar DecentXML. Escribí este analizador XML con el objetivo de diseño específico para preservar el formato original al 100% (es decir, con comentarios, espacios extraños en elementos o alrededor del elemento raíz, todo).

Durante el análisis del documento XML resultante, solo tiene que recordar los elementos que contienen el valor para sus opciones y reemplazar el nodo de texto en ellos. Cuando guardas, nada intacto cambiará de ninguna manera.

4

El código de ejemplo para utilizar el del librar de configuración de Apache Commons Contribuido por Patrick Boos es innecesariamente complicado. No necesita usar PropertiesConfigurationLayout explícitamente a menos que requiera un control avanzado sobre la salida. PropertiesConfiguration por sí sola es suficiente para conservar los comentarios y formato:

PropertiesConfiguration config = new PropertiesConfiguration("myprops.properties"); 
config.setProperty("Foo", "Bar"); 
config.save(); 

(Nota:.. Este código funciona para la 1.10 versión estable existente no he comprobado si funciona en construye actualmente disponible la alfa 2,0)

+0

Esto funcionó.Pero el problema es que, estamos obteniendo un espacio después de "=" en el par clave = valor, que no es deseado. Porque tengo valor con no necesita espacio. Por ejemplo: test = xyz es value en el archivo de propiedades. Pero después de ejecutar el código anterior, obtengo test = xyz. No necesito espacio antes de 'xyz' –

+0

No funciona con la Versión 2.1.1, estos métodos excepto setProperty no existe. Sin embargo, tengo curiosidad por saber por qué eliminaron métodos tan elegantes, como 'save()' ... :( – GOXR3PLUS

1
File file = new File("src/test/resources/1automation.properties"); 
    PropertiesConfiguration config = new PropertiesConfiguration(); 
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config); 
    layout.load(new InputStreamReader(new FileInputStream(file))); 
    FileWriter fw = new FileWriter("src/test/resources/1automation.properties",false); 
    config.setProperty("myssi.admin.name", "testValue"); 
    layout.save(fw); 
+0

Esto funcionó, pero el problema es que estamos obteniendo un espacio después de "=" en el par clave = valor, que no es deseado. Porque tengo valor con no necesita espacio. Por ejemplo: test = xyz es value en el archivo de propiedades. Pero después de ejecutar el código anterior, obtengo test = xyz. No necesito espacio antes de 'xyz' –

+0

Mi comentario puede ser un poco tarde, pero siempre puedes usar 'trim()' para eliminar espacios no deseados. –

Cuestiones relacionadas