setting-datei verändern

Ronin-Jay

Erfahrenes Mitglied
Hallo Gemeinschaft,

ich habe eine simple Settingsdatei, aus der ich Konfigurationseinstellungen lade. Das funktioniert soweit alles problemlos und einfach. Allerdings möchte ich diverse Konfigurationen auch über die Applikation verändern können und dementsprechend wieder in die Datei schreiben....

Die Settings-Datei sieht wie folgt aus:
Code:
# Enter the name of the machine hosting the database server
DB.Host = localhost
DB.Port = 1521

# Enter the driverclass for the databaseconnection
# e.g. oracle.jdbc.OracleDriver
DB.DriverClass = oracle.jdbc.OracleDriver

# Enter the name of the database instance you are running
DB.OraSID= xe

# DB.DriverType is < thin | oci8 >


Mittels folgenden Zeilen lese ich die verschiedenen Elemente aus:
Java:
try{
				in  = ClassLoader.getSystemResourceAsStream(CONF_FILE);
			    res = new PropertyResourceBundle(in);
			} catch (IOException ioe) {
				System.err.println("Could not find settings-file.");
				System.exit(1);
			  }
			
			//set db-values
			this.dbHost		   = res.getString("DB.Host");
		    this.dbPort   	   = res.getString("DB.Port");
		    this.dbDriverClass = res.getString("DB.DriverClass");
		    this.dbOraSid 	   = res.getString("DB.OraSID");
		    this.dbUser	 	   = res.getString("DB.User");
		    this.dbPassword    = res.getString("DB.Password");


Gibt es nun eine einfache Möglichkeit, die neuen Einstellungen simpel gleich an die richtige Position in die Datei zu schreiben, ohne das ich erst die Datei lange danach suchen und anschließend den String ersetzen muß?
 
PropertyRescourceBundle zu nutzen ist schonmal nicht richtig. Diese Klasse ist dafür da um ein Programm in mehrere Sprachen übersetzen zu können. Daher wirst du mit der Klasse auch nicht weiterkommen.

Das was du benutzen könntest ist:
Java:
Properties props = new Properties();
props.load(ClassLoader.getSystemResourceAsStream(CONF_FILE));

//Auslesen
System.out.println("Host: " + props.get("DB.Host"));

/Ändern
props.put("DB.Host","127.0.0.1");

props.store(ClassLoader.getSystemResourceAsStream(CONF_FILE),"");

Allerdings bleiben dann die Kommentare und die Struktur der Datei nicht erhalten.

Besser ist es dann wohl Commons Configuration zu benutzen: http://jakarta.apache.org/commons/configuration/apidocs/index.html
 
Zuletzt bearbeitet:
Das ich das PropertyRessourceBundle dafür "zweckentfremdet" habe, war mir schon klar...
Aber danke für den Tipp mit Jakarta. Ich habe mir das ganze mal angeschaut und ein wenig probiert (Beispiel aus API), allerdings bekomme ich hierbei schon einen Fehler:

Java:
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;

public class TEST_Props {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String CONF_FILE = "inc/settings";
		
		PropertiesConfiguration cfg;
		try {
			cfg = new PropertiesConfiguration(CONF_FILE);
		} catch (ConfigurationException e) {
			// TODO Auto-generated catch block
			//e.printStackTrace();
		}
		
		System.out.println(cfg.getProperty("DB.Host"));
		//cfg.save();	
	}
}

Nun sagt er mir aber für Zeile 16 einen TypeMismatch:
Code:
Type mismatch: cannot convert from ConfigurationException to Throwable
 
Ja. Schau dir mal an was die ConfigurationException ist. Diese verweist auf eine Exception aus commons lang. Und wenn commons lang nicht da ist, so kann der Compiler nicht erkennen dass es sich um eine korrekte Exception handelt.
 
Ja. Schau dir mal an was die ConfigurationException ist. Diese verweist auf eine Exception aus commons lang. Und wenn commons lang nicht da ist, so kann der Compiler nicht erkennen dass es sich um eine korrekte Exception handelt.

Sorry Zeja, stehe gerade ein wenig auf dem Schlauch (Mag auch am Mittagessen liegen). http://jakarta.apache.org/commons/c...urationException.html#ConfigurationException()

Sobald ich noch ein:
Code:
import org.apache.commons.lang.exception.NestableException;
durchführe, ändert sich nichts...
 
Vielen Dank für Deine schnell Hilfestellung.

It rocks.... :)
Das schöne dabei ist, daß die Formatierung erhalten bleibt - nachteil: Man muß weitere Bibliotheken einbinden.

Aber es stellt sich mir die Frage: Ist der Aufwand nicht ein bißchen groß, nur um ein paar Konfigurationsdateien zu ändern? Es werden nur die Werte ausgelesen und evtl. neu reingeschrieben... Wäre es da nicht einfacher mit Properties (java.util) zu arbeiten und sich eine Hilfsfunktion zu bauen, welche die Konfig-Datei nach dem alten Wert durchsucht, die Position ermittelt und anschließend an genau der Stelle den neuen einträgt um die Formatierung zu wahren :confused: Würde dazu gerne noch mal die Meinung eines Programmierers hören.





Noch mal für die Nachwelt festgehalten, falls jemand die Commons Configuration nutzen möchte

In den Build-Path müssen einbezogen werden:
Code:
commons-lang-2.3.jar
commons-collections-3.2.jar
commons-logging-1.1.jar
commons-configuration-1.4.jar


Eine Bsp-Konfigurationsdatei:
Code:
# Enter the name of the machine hosting the database server
DB.Host = localhost
DB.Port = 1521

# Enter the driverclass for the databaseconnection
# e.g. oracle.jdbc.OracleDriver
DB.DriverClass = oracle.jdbc.OracleDriver

# Enter the name of the database instance you are running
DB.OraSID = xe

# DB.DriverType is < thin | oci8 >
DB.DriverType = thin

# DB.User
DB.User = system

# DB.Password
DB.Password = admin


und hier der Zugriff:
Java:
package CC;

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

public class TEST_Props {
	/**
	 * @param args
	 */
	public static void main(String[] args){
		// TODO Auto-generated method stub
		String CONF_FILE = "inc/settings";
		
		
		PropertiesConfiguration cfg = null;
		try {
			cfg = new PropertiesConfiguration(CONF_FILE);
		} catch (ConfigurationException e) {
			// TODO Auto-generated catch block
			//e.printStackTrace();
		  }
		
		//auslesen
		System.out.println(cfg.getProperty("DB.Host"));
		System.out.println(cfg.getProperty("DB.Port"));
		
		//ändern
		cfg.setProperty("DB.Port", "000000");
		try {
			//schreiben
			cfg.save();
		} catch (ConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}   
		
		//änderung kontrollieren
		System.out.println(cfg.getProperty("DB.Port"));
	}
}
 
Zurück