Vorlesung Informatik 2 - Teil A: Java Kurs

7.2 Konfiguration speichern

Viele Programme speichern beim Beenden einen Zustand, der beim nächsten Start wieder hergestellt wird. Beispiel sind die zuletzt verwendeten Dateien, das Verzeichnis in dem wir zuletzt waren, eine High-Score Liste, u.s.w.

Dazu kann man ein Properties-Objekt verwenden. Die Klasse java.util.Properties implementiert das  Map<String,String> Interface, d.h. man kann unter verschiedenen Schlüsseln Werte speichern und wieder abrufen, wobei Werte und Schlüssel Zeichenketten sind.

Ein Properties-Objekt i

Darüber hinaus kann man die kompletten Properties in eine Datei speichern und beim Starten des Programmes wieder abrufen.

Mit 

     System.getProperty("user.home")

bekommt man den Pfad zum Home-Verzeichnis des Benutzers, z.B. C:\Users\Uwe. Dort kann man den Zustand unserer Anwendung in einer Datei speichern und wiederherstellen.

Beispiel: nehmen wir an, wir wollen uns merken, wie oft eine Anwendung ausgeführt wurde und wann sie zum letzten mal verwendet wurde.

Der Einfachheit halber verwenden wir nur ein Main Programm ohne Fenster u.s.w.:

   public class PropertiesEinfach {
public static void main(String[] args) throws Exception{
Properties prop = new Properties();
File propFile = new File(System.getProperty("user.home")+"/testxxx.properties");
if(propFile.exists()) prop.loadFromXML(new FileInputStream(propFile));
prop.list(System.out);
int anzahlAufrufe = Integer.parseInt(""+prop.getOrDefault("AnzahlAufrufe", "0"));

prop.put("AnzahlAufrufe", ""+(anzahlAufrufe+1));
prop.put("LetzterAufruf", ""+new Date());
System.out.println(prop.get("LetzterAufruf"));
prop.storeToXML(new FileOutputStream(propFile), "Testanwendung Informatik 2");
}
}


Die folgende Klasse speichert die Properties bei jeder Änderung:

class MeineProperties extends Properties{
private File propFile;
public MeineProperties() {
try {
propFile = new File(System.getProperty("user.home")+"/"+getClass()+".properties");
if(propFile.exists()) super.loadFromXML(new FileInputStream(propFile));
}catch(Exception e) {
e.printStackTrace();
}
}

@Override
public Object put(Object key, Object value) {
super.put(key, value);
try {
super.storeToXML(new FileOutputStream(propFile),"");
}catch(Exception e) {
e.printStackTrace();
}
return value;
}
}

Das ist zwar sehr ineffizient, aber wir stellen sicher, dass die Werte immer gespeichert sind.


Lehrvideo (YouTube)