HOWTO · Java
Eigenschaftendatei in Java
Dieser Artikel behandelt die Eigenschaftendatei in Java.
Auf dieser Seite
Die Java-Klasse Properties speichert Anwendungskonfigurationen als Schlüssel-Wert-Paare, häufig in einer Datei mit der Endung .properties. Mit setProperty() fügen Sie Zeichenfolgen als Schlüssel und Werte hinzu, mit store() speichern Sie sie, mit load() lesen Sie sie ein und mit getProperty() rufen Sie eine einzelne Einstellung ab. Die Methode list() kann die geladenen Einträge zur Kontrolle anzeigen.
Die Arbeit mit .properties-Dateien wird in der Gruppe für Datei-E/A und Properties des Java-Tutorials behandelt, in der die Java-Anleitungen zur Konfiguration gesammelt sind.
Werte in einer Java-Properties-Datei erstellen und festlegen
Eine Properties-Datei enthält einen Eintrag pro Zeile. Zum Beispiel sind version=1.1 und projectName=PropertiesFileExample zwei getrennte Einträge; Zeilen, die mit # oder ! beginnen, sind Kommentare. Als Trennzeichen zwischen Schlüssel und Wert sind =, : oder Leerraum zulässig. Vorangestellter Leerraum vor einem Schlüssel wird ignoriert, und Werte dürfen Leerzeichen enthalten. Fügen Sie jedes Paar mit setProperty() hinzu und schreiben Sie die Sammlung anschließend mit store() samt optionalem Kommentar in die Datei.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;
public class JavaExample {
public static void main(String[] args) throws IOException {
Path directory = Files.createTempDirectory("properties-demo-");
Path file = directory.resolve("myConfigs.properties");
Properties properties = new Properties();
properties.setProperty("version", "1.1");
properties.setProperty("projectName", "PropertiesFileExample");
properties.setProperty("date", "2021/12/27");
try (OutputStream output = Files.newOutputStream(file)) {
properties.store(output, "Application settings");
}
}
}
Files.newOutputStream() erstellt die Datei, falls sie noch nicht vorhanden ist, und kürzt sie, wenn sie bereits existiert. Das übergeordnete Verzeichnis muss existieren; dieses Beispiel legt zuerst ein temporäres Verzeichnis an. Der Try-with-resources-Block schließt den Stream auch dann, wenn beim Schreiben ein Fehler auftritt. Verwenden Sie stattdessen einen festen Pfad, legen Sie vor dem Öffnen der Datei das übergeordnete Verzeichnis an. store() schreibt neben den Einträgen einen Kommentar und einen automatisch erzeugten Zeitstempel; diese Kommentarzeilen können sich daher bei jedem Durchlauf unterscheiden. Bei einem OutputStream werden Zeichen außerhalb des lateinischen Alphabets im Format der Properties-Datei maskiert. Mit einem Writer können Sie die Zeichenkodierung ausdrücklich festlegen.
Wenn Ihr Code java.io verwendet, verhält sich new FileOutputStream(path) beim Erstellen oder Kürzen der Datei genauso und setzt ebenfalls voraus, dass das übergeordnete Verzeichnis existiert. Schließen Sie den Stream wie oben mit Try-with-resources.
Eine Eigenschaft aus der Java-Properties-Datei abrufen
Um eine Einstellung abzurufen, öffnen Sie die gespeicherte Datei zum Lesen, rufen load() für ein Properties-Objekt auf und übergeben den gewünschten Schlüssel an getProperty(). Dieses Beispiel schreibt und liest die Datei innerhalb desselben Durchlaufs und ist daher nicht auf eine Datei angewiesen, die ein anderes Programm hinterlassen hat. Auch der Eingabestream wird mit Try-with-resources verwaltet, sodass die Datei nach dem Laden geschlossen wird.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;
public class JavaExample {
public static void main(String[] args) throws IOException {
Path directory = Files.createTempDirectory("properties-demo-");
Path file = directory.resolve("myConfigs.properties");
Properties saved = new Properties();
saved.setProperty("date", "2021/12/27");
try (OutputStream output = Files.newOutputStream(file)) {
saved.store(output, "Application settings");
}
Properties loaded = new Properties();
try (InputStream input = Files.newInputStream(file)) {
loaded.load(input);
}
String date = loaded.getProperty("date");
System.out.println(date == null ? "No date setting" : date);
}
}
Ist der Schlüssel nicht vorhanden, gibt getProperty() null zurück; es wird kein Fehler ausgelöst. Prüfen Sie bei optionalen Einstellungen auf null, oder geben Sie mit getProperty("theme", "light") einen Ersatzwert an. Eine fehlende Datei, ein nicht lesbarer Pfad oder ein anderes Problem beim Dateizugriff ist davon zu unterscheiden: Beim Öffnen oder Laden kann eine IOException auftreten. Behandeln Sie sie an einer geeigneten Stelle der Anwendung mit einer hilfreichen Meldung, oder überlassen Sie dem aufrufenden Code die Entscheidung zur Fehlerbehandlung. Das Beispiel deklariert IOException in main, damit der Ablauf zum Abrufen der Eigenschaft gut erkennbar bleibt. Eine Produktionsanwendung fängt die Ausnahme meist dort ab, wo sie zusätzlichen Kontext bereitstellen kann.
Alle Schlüssel und Werte aus der Java-Properties-Datei abrufen
Für eine schnelle Anzeige in der Konsole laden Sie die Datei und rufen list() mit System.out auf. Das folgende vollständige Beispiel erstellt zunächst selbst eine Eingabedatei und zeigt dann die geladenen Einträge an. Es enthält eine zweite Einstellung, damit die Ausgabe mehrere Schlüssel-Wert-Paare veranschaulicht.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;
public class JavaExample {
public static void main(String[] args) throws IOException {
Path directory = Files.createTempDirectory("properties-demo-");
Path file = directory.resolve("myConfigs.properties");
Properties saved = new Properties();
saved.setProperty("version", "1.1");
saved.setProperty("projectName", "PropertiesFileExample");
try (OutputStream output = Files.newOutputStream(file)) {
saved.store(output, "Application settings");
}
Properties loaded = new Properties();
try (InputStream input = Files.newInputStream(file)) {
loaded.load(input);
}
loaded.list(System.out);
}
}
list() ist für eine lesbare Diagnoseausgabe gedacht, nicht als allgemeine Iterationsschnittstelle. Die Darstellung und Reihenfolge der Einträge sind kein stabiles Format zum Parsen oder Vergleichen. Wenn Anwendungscode die Einträge verarbeiten muss, durchlaufen Sie stattdessen die Einträge oder Schlüssel des Properties-Objekts und behandeln Sie jeden Wert als Zeichenfolge. Bewahren Sie die ursprüngliche Datei als maßgebliche Quelle auf, wenn Reihenfolge oder Kommentare wichtig sind: Das Speichern von Properties dient Konfigurationsdaten; list() zeigt lediglich die Werte an, die aktuell im Speicher geladen sind.