Erste Schritte mit Java-Eigenschaften

Erste Schritte mit Java-Eigenschaften

1. Überblick

Die meisten Java-Anwendungen müssen irgendwann Eigenschaften verwenden, um einfache Parameter außerhalb des kompilierten Codes als Schlüssel-Wert-Paare zu speichern.

Daher unterstützt die Sprache erstklassige Eigenschaften -java.util.Properties - eine Dienstprogrammklasse, die für die Verarbeitung dieser Art von Konfigurationsdateien entwickelt wurde.

Darauf konzentrieren wir uns in diesem Artikel.

2. Laden von Eigenschaften

2.1. Aus Eigenschaftendateien

Beginnen wir mit einem Beispiel zum Laden von Schlüssel-Wert-Paaren aus Eigenschaftendateien. Wir laden zwei Dateien, die auf unserem Klassenpfad verfügbar sind:

app.properties:

version=1.0
name=TestApp
date=2016-11-12

Undcatalog:

c1=files
c2=images
c3=videos

Beachten Sie, dass die Eigenschaftendateien zwar empfohlen werden, das Suffix ".properties" zu verwenden, dies jedoch nicht erforderlich ist.

Wir können sie jetzt ganz einfach in die Instanz vonPropertiesladen:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String appConfigPath = rootPath + "app.properties";
String catalogConfigPath = rootPath + "catalog";

Properties appProps = new Properties();
appProps.load(new FileInputStream(appConfigPath));

Properties catalogProps = new Properties();
catalogProps.load(new FileInputStream(catalogConfigPath));


String appVersion = appProps.getProperty("version");
assertEquals("1.0", appVersion);

assertEquals("files", catalogProps.getProperty("c1"));

Solange der Inhalt einer Datei die Anforderungen für das Dateiformat der Eigenschaften erfüllt, kann er von der KlassePropertieskorrekt analysiert werden. Hier finden Sie weitere Details fürProperty file format.

2.2. Laden aus XML-Dateien

Neben Eigenschaftendateien kann die KlassePropertiesauch XML-Dateien laden, die den spezifischen DTD-Spezifikationen entsprechen.

Hier ist ein Beispiel zum Laden von Schlüssel-Wert-Paaren aus einer XML-Datei -icons.xml:




    xml example
    icon1.jpg
    icon2.jpg
    icon3.jpg

Laden wir es jetzt:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String iconConfigPath = rootPath + "icons.xml";
Properties iconProps = new Properties();
iconProps.loadFromXML(new FileInputStream(iconConfigPath));

assertEquals("icon1.jpg", iconProps.getProperty("fileIcon"));

3. Eigenschaften abrufen

Wir könnengetProperty(String key) undgetProperty(String key, String defaultValue) verwenden, um den Wert anhand seines Schlüssels zu erhalten.

Wenn das Schlüssel-Wert-Paar vorhanden ist, geben beide Methoden den entsprechenden Wert zurück. Wenn es jedoch kein solches Schlüssel-Wert-Paar gibt, gibt das erstere null zurück, und das letztere gibt stattdessendefaultValue zurück.

Beispielcode:

String appVersion = appProps.getProperty("version");
String appName = appProps.getProperty("name", "defaultName");
String appGroup = appProps.getProperty("group", "example");
String appDownloadAddr = appProps.getProperty("downloadAddr");

assertEquals("1.0", appVersion);
assertEquals("TestApp", appName);
assertEquals("example", appGroup);
assertNull(appDownloadAddr);

Beachten Sie, dass die KlassePropertieszwar die Methodeget()von der KlasseHashtableerbt, ich jedoch nicht empfehlen würde, sie zum Abrufen des Werts zu verwenden. Da die Methodeget() einen Wert vonObjectzurückgibt, der nur inString umgewandelt werden kann, und die MethodegetProperty() den rohen Wert vonObjectbereits ordnungsgemäß für Sie verarbeitet.

Der folgende Code wirft einException:

float appVerFloat = (float) appProps.get("version");

4. Eigenschaften festlegen

Wir können die MethodesetProperty()verwenden, um ein vorhandenes Schlüssel-Wert-Paar zu aktualisieren oder ein neues Schlüssel-Wert-Paar hinzuzufügen.

Beispielcode:

appProps.setProperty("name", "NewAppName"); // update an old value
appProps.setProperty("downloadAddr", "www.example.com/downloads"); // add new key-value pair

String newAppName = appProps.getProperty("name");
assertEquals("NewAppName", newAppName);

String newAppDownloadAddr = appProps.getProperty("downloadAddr");
assertEquals("www.example.com/downloads", newAppDownloadAddr);

Beachten Sie, dass die KlassePropertieszwar die Methodeput()und die MethodeputAll()von der KlasseHashtableerbt, ich jedoch nicht empfehlen würde, sie aus demselben Grund wie fürget() zu verwenden Methode: InProperties können nurString-Werte verwendet werden.

Der folgende Code funktioniert nicht wie gewünscht. Wenn SiegetProperty() verwenden, um den Wert abzurufen, wirdnull zurückgegeben:

appProps.put("version", 2);

5. Eigenschaften entfernen

Wenn Sie ein Schlüssel-Wert-Paar entfernen möchten, können Sie die Methoderemove()verwenden.

Beispiel Code:

String versionBeforeRemoval = appProps.getProperty("version");
assertEquals("1.0", versionBeforeRemoval);

appProps.remove("version");
String versionAfterRemoval = appProps.getProperty("version");
assertNull(versionAfterRemoval);

6. Geschäft

6.1. In Eigenschaftendateien speichern

Die KlassePropertiesbietet eine Methodestore() zur Ausgabe von Schlüssel-Wert-Paaren.

Beispielcode:

String newAppConfigPropertiesFile = rootPath + "newApp.properties";
appProps.store(new FileWriter(newAppConfigPropertiesFile), "store to properties file");

Der zweite Parameter dient als Kommentar. Wenn Sie keinen Kommentar schreiben möchten, verwenden Sie einfach null.

6.2. In XML-Dateien speichern

Die KlassePropertiesbietet auch eine MethodestoreToXML() zur Ausgabe von Schlüssel-Wert-Paaren im XML-Format.

Beispielcode:

String newAppConfigXmlFile = rootPath + "newApp.xml";
appProps.storeToXML(new FileOutputStream(newAppConfigXmlFile), "store to xml file");

Der zweite Parameter ist der gleiche wie bei der Methodestore().

7. Andere allgemeine Operationen

Die KlassePropertiesbietet auch einige andere Methoden zum Bedienen der Eigenschaften.

Beispielcode:

appProps.list(System.out); // list all key-value pairs

Enumeration valueEnumeration = appProps.elements();
while (valueEnumeration.hasMoreElements()) {
    System.out.println(valueEnumeration.nextElement());
}

Enumeration keyEnumeration = appProps.keys();
while (keyEnumeration.hasMoreElements()) {
    System.out.println(keyEnumeration.nextElement());
}

int size = appProps.size();
assertEquals(3, size);




8. Standardeigenschaftsliste

Das ObjektPropertieskann ein anderes ObjektPropertiesals Standardeigenschaftsliste enthalten. Die Standardeigenschaftsliste wird durchsucht, wenn der Eigenschaftsschlüssel im Original nicht gefunden wird.

Neben „app.properties“ haben wir eine weitere Datei - „default.properties“ - in unserem Klassenpfad:

default.properties:

site=www.google.com
name=DefaultAppName
topic=Properties
category=core-java

Beispiel Code:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();

String defaultConfigPath = rootPath + "default.properties";
Properties defaultProps = new Properties();
defaultProps.load(new FileInputStream(defaultConfigPath));

String appConfigPath = rootPath + "app.properties";
Properties appProps = new Properties(defaultProps);
appProps.load(new FileInputStream(appConfigPath));

assertEquals("1.0", appVersion);
assertEquals("TestApp", appName);
assertEquals("www.google.com", defaultSite);

9. Eigenschaften und Codierung

Standardmäßig wird erwartet, dass Eigenschaftendateien ISO-8859-1 (Latin-1) -codiert sind. Daher sollten Eigenschaften mit Zeichen außerhalb von ISO-8859-1 im Allgemeinen nicht verwendet werden.

Wir können diese Einschränkung ggf. mithilfe von Tools wie dem JDK native2ascii-Tool oder expliziten Codierungen für Dateien umgehen.

Bei XML-Dateien verwenden die MethodeloadFromXML()und die MethodestoreToXML()tandardmäßig die UTF-8-Zeichencodierung.

Wenn Sie jedoch eine anders codierte XML-Datei lesen, können Sie dies in der DeklarationDOCTYPEangeben. Das Schreiben ist auch flexibel genug - wir können die Codierung in einem dritten Parameter derstoreToXML()-API angeben.

10. Fazit

In diesem Artikel haben wir die grundlegende Verwendung derProperties-Klasse erläutert, einschließlich der Verwendung vonPropertieszum Laden und Speichern von Schlüssel-Wert-Paaren in Eigenschaften und im XML-Format sowie der Funktionsweise von Schlüssel-Wert-Paaren inPropertiest2) s Objekt, z. B. Abrufen von Werten, Aktualisieren von Werten, Abrufen seiner Größe und Verwenden einer Standardliste für dasProperties-Objekt.

Der vollständige Quellcode für das Beispiel ist inGitHub project verfügbar.