La classe Properties
À quoi sert cette classe?
La plupart des applications ont besoin de sauvegarder des données entre deux exécutions
Ces données peuvent être des paramètres de configuration ("préférences" de l'utilisateur) ou l'état de l'application au moment de sa fermeture (par exemple dans un jeu, la position des joueurs ou le pointage)
Ces données sont généralement conservées dans un ou plusieurs fichiers sous forme de couples nom-valeur, par exemple :
langue=francais
fuseau horaire=EST UTC-5
sauvegarde=automatiqe
wifi=non
nom=Saroumane
type=magicien
niveau=3
points=4771
La classe java.util.Properties offre aux développeurs Java les méthodes nécessaires à la récupération et la sauvegarde de ces données
Charger des propriétés
Pour lire des propriétés depuis un fichier, il faut d'abord créer un objet de la classe Properties
Puis, à l'aide de la méthode load(), on charge le contenu du fichier
Même si les propriétés sont toujours conservées en format texte, le flux utilisé peut être texte ou binaire
Quant au nom du fichier, le suffixe .properties n'est pas obligatire, même si recommandé
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class Exemple {
private Properties mProp;
private Properties mPropDefaut;
public void chargerProp() {
mProp = new Properties();
try {
FileReader reader = new FileReader("jeu.properties");
mProp.load(reader);
reader.close();
} catch (IOException ioe) {
// ...
}
}
...
public static void main(String args[]) {
Exemple app = new Exemple();
app.chargerProp();
//app.chargerPropDefaut();
app.lireProp();
app.ecrireProp();
app.sauvegarder();
}
}
Lire des propriétés
La lecture d'une propriété se fait à l'aide de la méthode load() à laquelle on fournit la clé (chaîne de caractères) sous laquelle a été enregistrée la propriété
public void lireProp() {
String nom = mProp.getProperty("nom");
String type = mProp.getProperty("type");
// ...
System.out.println("Nom = " + nom);
// ...
}
Il faut garder à l'esprit que les valeurs récupérées avec la méthode load() sont toujours des chaînes de caractères qu'il faudra convertir au besoin :
int niveau;
try {
niveau = Integer.parseInt(mProp.getProperty("niveau"));
} catch (NumberFormatException nfe) {
// ...
}
Valeurs par défaut
Mais qu'arrive-t-il si une propriété recherchée est absente du fichier?
String couleur = mProp.getProperty("couleur");
System.out.println(couleur);
// affiche "null"
La solution est de fournir à la méthode getProperty() une valeur par défaut
String couleur = prop.getProperty("couleur", "blanc");
System.out.println(couleur);
// affiche "blanc"
On peut aller plus loin en prévoyant un tout un ensemble de valeurs par défaut, valeurs qui seront conservées dans un autre objet Properties contenant les valeurs par défaut
Cet objet sera chargé de valeurs fournies directement dans le code et permettra donc à l'application de fonctionner dans tous les cas, même en l'absence du fichier de propriétés (vous devrez quand même prévoir la levée d'une FileNotFoundException)
L'objet Properties contenant les valeurs par défaut devra être passé en paramètre au constructeur du second objet, celui responsable du chargement dynamique des propriétés
Dans l'exemple suivant le fichier contenant les propriétés est introuvable :
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class Exemple {
private Properties mProp;
private Properties mPropDefaut;
...
public void chargerPropDefaut() {
mPropDefaut = new Properties();
mPropDefaut.setProperty("nom", "Radagast");
mPropDefaut.setProperty("type", "magicien");
mPropDefaut.setProperty("niveau", "3");
mPropDefaut.setProperty("points", "4771");
mProp = new Properties(mPropDefaut);
try {
FileReader reader = new FileReader("personnage.properties");
mProp.load(reader);
reader.close();
} catch (FileNotFoundException fnfe) {
System.err.println("Fichier de configuration introuvable\n"
+ "Utilisation des valeurs par défaut");
} catch (IOException ioe) {
// ...
}
String nom = prop.getProperty("nom");
System.out.println("Nom = " + nom);
...
}
Ce seront donc les valeurs par défaut qui seront utilisées :
C:\>java Exemple
Fichier de configuration introuvable
Utilisation des valeurs par défaut
Nom = Radagast
...
Écrire des propriétés
On utilise la méthode setProperty() pour changer la valeur d'une propriété existante ou en créer une nouvelle :
public void ecrireProp() {
// mise à jour d'une propriété existante
mProp.setProperty("nom", "Gandalf");
// création d'une nouvelle propriété
mProp.setProperty("age", "11000");
// ...
On peut aussi supprimer une propriété avec la méthode remove() :
// suppression d'une propriété
mProp.remove("niveau");
}
Sauvegarder des propriétés
À la fermeture normale de l'application (ou même lors d'une fermeture anormale si c'est possible), on procède à la sauvegarde des propriétés dans un fichier avec la méthode store() :
public void sauvegarder() {
try {
FileWriter writer = new FileWriter("jeu.properties");
mProp.store(writer, "Ceci est un commentaire");
writer.close();
} catch (IOException ioe) {
// ...
}
}
Contenu du fichier :
#Ceci est un commentaire
#Tue Feb 04 08:28:50 EST 2020
nom=Gandalf
type=magicien
points=4771
age=11000
La date de sauvegarde est automatiquement ajoutée aux données
Si on ne tient pas à ajouter un commentaire, on utilise "null" comme second paramètre
mProp.store(writer, null);