Erste Schritte mit Java-Eigenschaften

1. Übersicht

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

Daher bietet die Sprache erstklassige Unterstützung für 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 wir auf unserem Klassenpfad zur Verfügung haben:

app.properties:

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

Und Katalog :

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 eine Properties- Instanz laden :

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 Eigenschaftendateiformat erfüllt, kann er von der Properties- Klasse korrekt analysiert werden . Hier finden Sie weitere Details zum Eigenschaftendateiformat.

2.2. Laden aus XML-Dateien

Neben Eigenschaftendateien kann die Properties- Klasse auch 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önnen getProperty (String-Schlüssel) und getProperty (String-Schlüssel, String defaultValue) verwenden , um den Wert anhand seines Schlüssels abzurufen .

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 stattdessen defaultValue zurück .

Beispielcode:

String appVersion = appProps.getProperty("version"); String appName = appProps.getProperty("name", "defaultName"); String appGroup = appProps.getProperty("group", "baeldung"); String appDownloadAddr = appProps.getProperty("downloadAddr"); assertEquals("1.0", appVersion); assertEquals("TestApp", appName); assertEquals("baeldung", appGroup); assertNull(appDownloadAddr);

Beachten Sie, dass die Properties- Klasse zwar die Methode get () von der Hashtable- Klasse erbt , ich jedoch nicht empfehlen würde, sie zum Abrufen des Werts zu verwenden. Da die Methode get () einen Objektwert zurückgibt, der nur in String umgewandelt werden kann, und die Methode getProperty () den unformatierten Objektwert bereits ordnungsgemäß für Sie verarbeitet.

Der folgende Code löst eine Ausnahme aus :

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

4. Legen Sie die Eigenschaften fest

Wir können die setProperty () -Methode 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.baeldung.com/downloads"); // add new key-value pair String newAppName = appProps.getProperty("name"); assertEquals("NewAppName", newAppName); String newAppDownloadAddr = appProps.getProperty("downloadAddr"); assertEquals("www.baeldung.com/downloads", newAppDownloadAddr);

Note that although Properties class inherits put() method and putAll() method from Hashtable class, I wouldn't recommend you use them for the same reason as for get() method: only String values can be used in Properties.

The code below will not work as you wish, when you use getProperty() to get its value, it will return null:

appProps.put("version", 2);

5. Remove Properties

If you want to remove a key-value pair, you can use remove() method.

Example Code:

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

6. Store

6.1. Store to Properties Files

Properties class provides a store() method to output key-value pairs.

Example code:

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

The second parameter is for comment. If you don't want to write any comment, simply use null for it.

6.2. Store to XML Files

Properties class also provides a storeToXML() method to output key-value pairs in XML format.

Example code:

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

The second parameter is as same as it in the store() method.

7. Other Common Operations

Properties class also provides some other methods to operate the properties.

Example code:

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. Default Property List

A Properties object can contain another Properties object as its default property list. The default property list will be searched if the property key is not found in the original one.

Besides “app.properties“, we have another file – “default.properties” – on our classpath:

default.properties:

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

Example 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. Properties and Encoding

By default, properties files are expected to be ISO-8859-1 (Latin-1) encoded, so properties with characters outside of the ISO-8859-1 shouldn't generally be used.

We can work around that limitation with the help of tools such as the JDK native2ascii tool or explicit encodings on files, if necessary.

For XML files, the loadFromXML() method and the storeToXML() method use UTF-8 character encoding by default.

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

10. Schlussfolgerung

In diesem Artikel haben wir grundlegende diskutierten Eigenschaften Klasse - Nutzung, einschließlich , wie Sie mit Eigenschaften sowohl Lade- und Speicher Schlüssel-Wert - Paaren in Eigenschaften und XML - Format, wie Schlüssel-Wert - Paare in einem für den Betrieb Eigenschaften Objekt, wie Werte, zu aktualisieren Werte abrufen , ermitteln Sie die Größe und die Verwendung einer Standardliste für ein Eigenschaftenobjekt .

Der vollständige Quellcode für das Beispiel ist in diesem GitHub-Projekt verfügbar.