Mise en route des propriétés Java

Débuter 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 en tant que paires clé-valeur, en dehors du code compilé.

Et donc le langage a un support de première classe pour les propriétés - lesjava.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

Etcatalog:

c1=files
c2=images
c3=videos

Notez que même s'il est recommandé d'utiliser le suffixe «.properties» pour les fichiers de propriétés, ce n'est pas nécessaire.

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

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 classeProperties. Voici plus de détails surProperty file format.

2.2. Charger à partir de fichiers XML

Outre les fichiers de propriétés, la classeProperties 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 des propriétés

Nous pouvons utilisergetProperty(String key) etgetProperty(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 retourneradefaultValue à la place.

Exemple de code:

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

Notez que bien que la classeProperties hérite de la méthodeget() de la classeHashtable, je ne vous recommanderais pas de l'utiliser pour obtenir de la valeur. Parce que sa méthodeget() renverra une valeurObject qui ne peut être convertie qu'enString et que la méthodegetProperty() gère déjà correctement la valeur bruteObject pour vous.

Le code ci-dessous lancera unException:

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

4. Définir les propriétés

Nous pouvons utiliser la méthodesetProperty() 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.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);

Notez que bien que la classeProperties hérite de la méthodeput() et de la méthodeputAll() de la classeHashtable, je ne vous recommanderais pas de les utiliser pour la même raison que pourget() méthode: seules les valeursString peuvent être utilisées dansProperties.

Le code ci-dessous ne fonctionnera pas comme vous le souhaitez, lorsque vous utilisezgetProperty() pour obtenir sa valeur, il retourneranull:

appProps.put("version", 2);

5. Supprimer les propriétés

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

Exemple de code:

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

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

6. Boutique

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

La classeProperties fournit une méthodestore() 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");

Le deuxième paramètre est pour le commentaire. Si vous ne souhaitez pas écrire de commentaire, utilisez simplement null.

6.2. Stocker dans des fichiers XML

La classeProperties fournit également une méthodestoreToXML() pour générer des paires clé-valeur au format XML.

Exemple de code:

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

Le deuxième paramètre est identique à celui de la méthodestore().

7. Autres opérations courantes

La classeProperties fournit également d'autres méthodes pour faire fonctionner les propriétés.

Exemple de 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. Liste des propriétés par défaut

Un objetProperties peut contenir un autre objetProperties comme liste de propriétés par défaut. La liste de propriétés par défaut sera recherchée si la clé de propriété n’est pas trouvée dans la clé originale.

Outre «app.properties», nous avons un autre fichier - «default.properties» - sur notre chemin de classe:

default.properties:

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

Exemple de 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. Propriétés et encodage

Par défaut, les fichiers de propriétés sont censés être encodés ISO-8859-1 (Latin-1). Par conséquent, les propriétés avec des caractères en dehors de l'ISO-8859-1 ne doivent généralement pas être utilisées.

Nous pouvons contourner cette limitation à l'aide d'outils tels que l'outil JDK native2ascii ou d'encodages explicites sur des fichiers, si nécessaire.

Pour les fichiers XML, la méthodeloadFromXML() et la méthodestoreToXML() utilisent le codage de caractères UTF-8 par défaut.

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

10. Conclusion

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

Le code source complet de l'exemple est disponible dans ceGitHub project.