Accueil

Cours

Liens (à venir)


Messages
Cours
420-KF1-LG - Développement Environnement Intelligent - Hiver 2020
Semaine 22 avril
=======================
KHX - Système 3
Module 4 - 5
-------------------------------------
127 - Script 2
Module 4 - Temps travail
-------------------------------------
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);