2009-02-19 20 views
32

Sebbene java.util.properties consenta la lettura e la scrittura di file di proprietà, la scrittura non conserva la formattazione. Non sorprende, perché non è legato al file delle proprietà.Una classe migliore per aggiornare i file delle proprietà?

Esiste una classe PropertyFile - o qualcosa del genere - che conserva i commenti e le righe vuote e aggiorna i valori delle proprietà in posizione?

risposta

44

Non funziona molto meglio dell'API Apache's Commons Configuration. Ciò fornisce un approccio unificato alla configurazione dai file di proprietà, XML, JNDI, origini dati JDBC, ecc.

La gestione dei file delle proprietà è molto buona. Ti consente di generare un oggetto PropertiesConfigurationLayout dalla tua proprietà che conserva quante più informazioni possibili sul tuo file di proprietà (spazi bianchi, commenti, ecc.). Quando salvi le modifiche al file delle proprietà, queste verranno conservate nel miglior modo possibile.


codice di esempio:

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

Vedi anche:

+0

Funziona alla grande e mantiene i commenti lì. Ha preso la libertà di aggiungere qualche codice di esempio :) –

+7

Il codice fornito non viene compilato .. propsFile non viene dichiarato – blank

+0

Cosa succede se si dispone di un valore chiave come Spring.Names = cookie @! Jar @! Johnson @! James @! Green @! Patrick. Come aggiungerebbe "Jimmy" dopo il patrick? – Jesse

6

È possibile dare un'occhiata allo Apache Commons Configuration, che contiene la classe PropertiesConfiguration. Tuttavia, come ho mai usato, non so se conserva i commenti e la formattazione ...

Tuttavia, worthes una prova ...

+0

In base ai documenti, una classe "PropertiesConfigurationLayout" preserverà la formattazione e i commenti. –

0

una volta ho visto una classe per fare questo con i file INI ma non riesce più a trovare il collegamento. Se non riesci a trovare qualcos'altro, puoi provare DecentXML. Ho scritto questo parser XML con l'obiettivo di design specifico per preservare la formattazione originale al 100% (cioè con commenti, spazi strani negli elementi o attorno all'elemento radice, tutto).

Durante l'analisi del documento XML risultante, è sufficiente ricordare gli elementi che contengono il valore per le opzioni e sostituire il nodo di testo al loro interno. Quando salvi, nulla di intatto cambierà in alcun modo.

4

Il codice di esempio per l'utilizzo del coll di configurazione di Apache Commons Il tuo contributo di Patrick Boos è inutilmente complicato. Non è necessario utilizzare PropertiesConfigurationLayout esplicitamente, a meno che non sia necessario un controllo avanzato sull'output. PropertiesConfiguration di per sé è sufficiente per preservare i commenti e la formattazione:

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

(Nota:.. Questo codice funziona per la 1.10 versione stabile attuale non ho controllato se funziona sul alpha 2.0 si basa attualmente disponibile)

+0

Questo ha funzionato.Ma il problema è che stiamo ottenendo uno spazio dopo "=" nella coppia chiave = valore, che è indesiderato. Perché ho un valore con doesnot bisogno di spazio. Ad esempio: test = xyz è valore nel file delle proprietà. Ma dopo aver eseguito il codice sopra, sto ricevendo test = xyz. Non ho bisogno di spazio prima di 'xyz' –

+0

Non funziona con la versione 2.1.1, questi metodi eccetto setProperty non esiste. Sono molto curioso di sapere perché hanno rimosso metodi così eleganti, come '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

Questo ha funzionato, ma il problema è che stiamo ottenendo uno spazio dopo "=" in coppia chiave = valore, che non è voluto, perché ho un valore con non ha bisogno di spazio Ad esempio: test = xyz è il valore nel file delle proprietà, ma dopo aver eseguito il codice precedente, sto ricevendo test = xyz. Non ho bisogno di spazio prima di 'xyz' –

+0

potrebbe essere un po 'troppo tardi, ma puoi sempre usare 'trim()' per rimuovere gli spazi indesiderati. –

Problemi correlati