Premiers pas avec les propriétés Java

1. Vue d'ensemble

La plupart des applications Java doivent utiliser des propriétés à un moment donné, généralement pour stocker des paramètres simples sous forme de paires clé-valeur, en dehors du code compilé.

Et donc le langage a un support de première classe pour les propriétés - le java.util.Properties - une classe utilitaire conçue pour gérer ce type de fichiers de configuration.

C'est ce sur quoi nous allons nous concentrer dans cet article.

2. Chargement des propriétés

2.1. À partir des fichiers de propriétés

Commençons par un exemple de chargement de paires clé-valeur à partir de fichiers de propriétés; nous chargeons deux fichiers disponibles sur notre chemin de classe:

app.properties:

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

Et catalogue :

c1=files c2=images c3=videos

Notez que bien qu'il soit recommandé aux fichiers de propriétés d'utiliser « .properties », le suffixe, ce n'est pas nécessaire.

Nous pouvons maintenant les charger très simplement dans une instance Properties :

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"));

Tant que le contenu d'un fichier répond aux exigences de format de fichier de propriétés, il peut être analysé correctement par la classe Properties . Voici plus de détails sur le format de fichier de propriété.

2.2. Charger à partir de fichiers XML

Outre les fichiers de propriétés, la classe Properties peut également charger des fichiers XML conformes aux spécifications DTD spécifiques.

Voici un exemple de chargement de paires clé-valeur à partir d'un fichier XML - icons.xml :

   xml example icon1.jpg icon2.jpg icon3.jpg 

Maintenant, chargeons-le:

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. Obtenir les propriétés

Nous pouvons utiliser getProperty (String key) et getProperty (String key, String defaultValue) pour obtenir la valeur par sa clé.

Si la paire clé-valeur existe, les deux méthodes renverront toutes les deux la valeur correspondante. Mais s'il n'y a pas une telle paire clé-valeur, la première retournera null, et la seconde retournera defaultValue à la place.

Exemple de code:

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);

Notez que bien que la classe Properties hérite de la méthode get () de la classe Hashtable , je ne vous recommanderais pas de l'utiliser pour obtenir de la valeur. Parce que sa méthode get () renverra une valeur Object qui ne peut être convertie qu'en String et que la méthode getProperty () gère déjà correctement la valeur Object brute pour vous.

Le code ci-dessous lèvera une exception :

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

4. Définir les propriétés

Nous pouvons utiliser la méthode setProperty () pour mettre à jour une paire clé-valeur existante ou ajouter une nouvelle paire clé-valeur.

Exemple de code:

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);

Notez que bien que la classe Properties hérite de la méthode put () et de la méthode putAll () de la classe Hashtable , je ne vous recommanderais pas de les utiliser pour la même raison que pour la méthode get () : seules les valeurs String peuvent être utilisées dans Properties .

Le code ci-dessous ne fonctionnera pas comme vous le souhaitez, lorsque vous utilisez getProperty () pour obtenir sa valeur, il retournera null :

appProps.put("version", 2);

5. Supprimer les propriétés

Si vous souhaitez supprimer une paire clé-valeur, vous pouvez utiliser la méthode remove () .

Exemple de code:

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

6. Magasin

6.1. Stocker dans les fichiers de propriétés

La classe Properties fournit une méthode store () pour générer des paires clé-valeur.

Exemple de 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.

Cependant, lors de la lecture d'un fichier XML encodé différemment, nous pouvons le spécifier dans la déclaration DOCTYPE ; l'écriture est également assez flexible - nous pouvons spécifier l'encodage dans un troisième paramètre de l' API storeToXML () .

10. Conclusion

Dans cet article, nous avons discuté de l' utilisation de base de la classe Properties , y compris comment utiliser Properties load et stocker des paires clé-valeur à la fois dans les propriétés et au format XML, comment faire fonctionner les paires clé-valeur dans un objet Properties , comme récupérer des valeurs, mettre à jour les valeurs , obtenez sa taille et comment utiliser une liste par défaut pour un objet Properties .

Le code source complet de l'exemple est disponible dans ce projet GitHub.