Config

1

1445672

Gast
Hi Leute,
ich bin relativ neu bei Java, und versuche gerade eine config-Datei auszuwerten.
Durch ein bisschen Suchen bin ich auf verschieden Möglichkeiten gestoßen.

Ich habe es mit der java.util.Properties Klasse versucht:
Java:
java.util.Properties cfg = new Properties();
try {
  cfg.load(this.getClass().getClassLoader().getResourceAsStream("config.cfg"));
} catch (IOException e) {
  e.printStackTrace();
}
wert = cfg.getProperty("key");
 

RySa

Bekanntes Mitglied
Das heißt, dass die Datei gar nicht geladen wird. Wenn du den ClassLoader benutzen willst, und dann nur den Namen der config-Datei eingibst, muss die Datei sich auch im gleichen Ordner wie deine .class Datei befinden. Willst du es vom .jar laden ? Wenn ja dann bedenke dass wenn deine .class Dateien sich im ....../file.jar!/projektname/packagename/klasse.class befinden, dann wird der ClassLoader ab diesem Pfad ....../file.jar!/projektname/packagename anfangen, und bei der Suche nach "config.cfg" wird er da suchen : .../file.jar!/projektname/packagename/config.cfg (bin allerdings nicht 100% sicher). Wenn die Datei in unterordnern ist, muss du diese auch angeben, also z.b "configs/config.cfg".
 
1

1445672

Gast
Hab daraus jetzt mal ein kleines Programm gemacht:
Java:
import java.io.IOException;
import java.util.Properties;

public class ConfigLoad {
	static Properties cfg;
	public ConfigLoad() {
		cfg = new Properties();
		try {
			cfg.load(this.getClass().getClassLoader().getResourceAsStream("config.properties"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String args[]) {
		String beispiel = cfg.getProperty("foo");
		System.out.println(beispiel);
	}
}
Die config.properties habe ich direkt in das Verzeichnis der .class Datei gemacht und es kommt nach wie vor die NullPointerException.
 
1

1445672

Gast
Das new ConfigLoad() fehlt sehe ich gerade, funzt aber immer noch nicht.
Sry für DP, kann hier nichts editieren.
 

1445672

Mitglied
So, hab mich mal angemeldet und neue Erkenntnis gewonnen:

Wenn die Datei dort ist, von wo aus ich die .class Datei starte, funktioniert das ganze.
Wenn das in eine .jar mache geht wieder nichts (Datei in der jar und im Verzeichnis der jar).

Jetzt is die Frage warum das nur so geht und ob ich nicht auch eine Datei außerhalb laden kann, geht ja mit read und write auch.
 

Ariol

Top Contributor
Java:
import java.io.IOException;
import java.util.Properties;
 
public class ConfigLoad {
    static Properties cfg;
    public ConfigLoad() {
        cfg = new Properties();
        try {
            cfg.load(new File("config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String args[]) {
        String beispiel = cfg.getProperty("foo");
        System.out.println(beispiel);
    }
}


EDIT: Das übliche Problem mal umgekehrt :D
 

turtle

Top Contributor
Java:
public class Prefs {

	public static void main(String[] args) {
		Preferences prefs = Preferences.userNodeForPackage(Prefs.class);
		String fooString = prefs.get("foo", "defaultValue");
		System.out.println("Foo:"+fooString);
		prefs.put("foo", "Ein Wert");
	}

}
Ist das nicht einfacher?
 

1445672

Mitglied
Aber damit lese ich ja nichts ein, oder hab ich da was falsch verstanden?
Ich will doch meine Einstellungen aus einer Datei lesen und nicht im Programm definieren.

@Ariol: Super jetzt ham wa halt ein File Objekt was load nichts bringt :autsch:
 
Zuletzt bearbeitet:

turtle

Top Contributor
Nein, das hast Du falsch verstanden.

Mit Preferences wird das Lesen/Speichern von Daten, die sonst in Properties-Dateien abgelegt wurden, vereinfacht. In Windows zum Beispiel werden die Daten in/aus der Registry, schau mal unter HKEY_CURRENT_USER\Software\JavaSoft\Prefs, gelesen. Damit vereinfacht sich das Handling extrem, weil nicht darauf geachtet werden muss, wo die Properties Datei liegt (Pfad) oder aus einer Jar-Datei kommt.
 
Zuletzt bearbeitet:

1445672

Mitglied
Achso, da wird in die Registy geschrieben.
Das is dann halt blöd mit dem Ändern, dafür müsste man ja dann im Programm was einbauen oder manuell in der Registry ändern.
Finde ich bisschen viel Aufwand für ein kleines Programm wo ich nur ein paar Werte brauche.

Aber es wird doch sicher möglich sein auf eine Config-Datei außerhalb zuzugreifen (außer sie manuell auszulesen)?
 

turtle

Top Contributor
Auch achso, weil Du nicht geschrieben hast, dass der Benutzer die Config ändern können soll.
Meine Variante ist für Programme, die ihre Konfiguration speichern und wieder lesen. Mit Dialogen in der Applikation kann man ja meistens die KOnfiguration ändern (z.B. Menu "Options"), speichern und beim nächsten Start wieder auslesen.

Aber natürlich geht auch das Lesen einer Properties-Datei ziemlich einfach:
Java:
Properties props = new Properties();
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(propFileName);
props.load(inputStream);
Damit muss die Properties-Datei "nur" im Classpath liegen.
 

turtle

Top Contributor
Properties enthalten Key/Value-Paare. Die kannst Du einfach mit get(key) abfragen und wieder speichern.

Wenn Dir das nicht reicht, musst Du Dir in der Tat was Eigenes schreiben. Vielleicht lohnt ja ein Blick hierhin Commons Configuration - Java Configuration API.Damit werden zumindest die grundsätzlichen Typen wie Double, Integer,.. abgehandelt.
 

Ariol

Top Contributor
@Ariol: Super jetzt ham wa halt ein File Objekt was load nichts bringt :autsch:

Hab mich wohl in der Javadoc verlesen.
Dann eben so:
Java:
public class ConfigLoad {
    static Properties cfg;
    public ConfigLoad() {
        cfg = new Properties();
        try {
            cfg.load(new FileInputStream("config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String args[]) {
        String beispiel = cfg.getProperty("foo");
        System.out.println(beispiel);
    }
}

mit
Code:
this.getClass().getClassLoader().getResourceAsStream("config.properties")
suchst du im Jar.
Mit
Code:
new FileInputStream("config.properties")
außerhalb davon.
 

Ähnliche Java Themen

Neue Themen


Oben