Recherche…


Introduction

L'objet properties contient une paire clé et valeur sous forme de chaîne. La classe java.util.Properties est la sous-classe de Hashtable.

Il peut être utilisé pour obtenir une valeur de propriété basée sur la clé de propriété. La classe Properties fournit des méthodes pour extraire des données du fichier de propriétés et stocker des données dans un fichier de propriétés. De plus, il peut être utilisé pour obtenir les propriétés du système.

Avantage du fichier de propriétés

La recompilation n'est pas requise si les informations sont modifiées à partir du fichier de propriétés: Si des informations sont modifiées à partir de

Syntaxe

  • Dans un fichier de propriétés:
  • clé = valeur
  • #commentaire

Remarques

Un objet Propriétés est une carte dont les clés et les valeurs sont des chaînes par convention. Bien que les méthodes de Map puissent être utilisées pour accéder aux données, les méthodes plus sûres getProperty , setProperty et stringPropertyNames sont généralement utilisées à la place.

Les propriétés sont fréquemment stockées dans des fichiers de propriétés Java, qui sont de simples fichiers texte. Leur format est documenté en détail dans la méthode Properties.load . En résumé:

  • Chaque paire clé / valeur est une ligne de texte avec un espace, est égale à ( = ) ou deux points ( : ) entre la clé et la valeur. Les égaux ou deux-points peuvent avoir n'importe quelle quantité d'espaces avant et après, ce qui est ignoré.
  • Les espaces blancs sont toujours ignorés, les espaces à la fin sont toujours inclus.
  • Une barre oblique inverse peut être utilisée pour échapper à n'importe quel caractère (sauf les minuscules u ).
  • Une barre oblique inverse à la fin de la ligne indique que la ligne suivante est une continuation de la ligne en cours. Cependant, comme pour toutes les lignes, les espaces blancs dans la ligne de continuation sont ignorés.
  • Tout comme dans le code source Java, \u suivi de quatre chiffres hexadécimaux représente un caractère UTF-16.

La plupart des frameworks, y compris les propres installations de Java SE telles que java.util.ResourceBundle, chargent les fichiers de propriétés en tant que InputStreams. Lors du chargement d'un fichier de propriétés à partir d'un InputStream, ce fichier ne peut contenir que des caractères ISO 8859-1 (c'est-à-dire des caractères compris entre 0 et 255). Tout autre caractère doit être représenté comme \u s'échappe. Cependant, vous pouvez écrire un fichier texte dans n'importe quel encodage et utiliser l'outil native2ascii (fourni avec chaque JDK) pour le faire.

Si vous chargez un fichier de propriétés avec votre propre code, il peut s'agir d'un encodage quelconque, à condition que vous créiez un Reader (tel qu'un InputStreamReader ) basé sur le Charset correspondant. Vous pouvez ensuite charger le fichier en utilisant load (Reader) au lieu de la méthode de chargement héritée (InputStream).

Vous pouvez également stocker des propriétés dans un simple fichier XML, ce qui permet au fichier lui-même de définir le codage. Un tel fichier peut être chargé avec la méthode loadFromXML . La DTD décrivant la structure de ces fichiers XML se trouve à l' adresse http://java.sun.com/dtd/properties.dtd .

Chargement des propriétés

Pour charger un fichier de propriétés fourni avec votre application:

public class Defaults {

    public static Properties loadDefaults() {
        try (InputStream bundledResource =
            Defaults.class.getResourceAsStream("defaults.properties")) {

            Properties defaults = new Properties();
            defaults.load(bundledResource);
            return defaults;
        } catch (IOException e) {
            // Since the resource is bundled with the application,
            // we should never get here.
            throw new UncheckedIOException(
                "defaults.properties not properly packaged"
                + " with application", e);
        }
    }

}

Les fichiers de propriétés indiquent les espaces vides:

Examinez attentivement ces deux fichiers de propriétés qui sont apparemment complètement identiques:

entrer la description de l'image ici

sauf qu'ils ne sont pas vraiment identiques:

entrer la description de l'image ici

(les captures d'écran proviennent de Notepad ++)

Comme les espaces blancs sont conservés, la valeur de lastName est "Smith" dans le premier cas et "Smith " dans le second cas.

Très rarement, c'est ce que les utilisateurs attendent et ils ne peuvent que spéculer sur le comportement par défaut de la classe Properties . Il est toutefois facile de créer une version améliorée des Properties pour résoudre ce problème. La classe suivante, TrimmedProperties , ne fait que cela. C'est un remplacement instantané pour la classe Propriétés standard.

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Map.Entry;
import java.util.Properties;

/**
 * Properties class where values are trimmed for trailing whitespace if the
 * properties are loaded from a file.
 *
 * <p>
 * In the standard {@link java.util.Properties Properties} class trailing
 * whitespace is always preserved. When loading properties from a file such
 * trailing whitespace is almost always <i>unintentional</i>. This class fixes
 * this problem. The trimming of trailing whitespace only takes place if the
 * source of input is a file and only where the input is line oriented (meaning
 * that for example loading from XML file is <i>not</i> changed by this class).
 * For this reason this class is almost in all cases a safe drop-in replacement
 * for the standard <tt>Properties</tt>
 * class.
 *
 * <p>
 * Whitespace is defined here as any of space (U+0020) or tab (U+0009).
 * * 
 */
public class TrimmedProperties extends Properties {

    /**
     * Reads a property list (key and element pairs) from the input byte stream.
     * 
     * <p>Behaves exactly as {@link java.util.Properties#load(java.io.InputStream) }
     * with the exception that trailing whitespace is trimmed from property values
     * if <tt>inStream</tt> is an instance of <tt>FileInputStream</tt>.
     * 
     * @see java.util.Properties#load(java.io.InputStream) 
     * @param inStream the input stream.
     * @throws IOException if an error occurred when reading from the input stream.
     */
    @Override
    public void load(InputStream inStream) throws IOException {
        if (inStream instanceof FileInputStream) {
            // First read into temporary props using the standard way
            Properties tempProps = new Properties();
            tempProps.load(inStream);
            // Now trim and put into target
            trimAndLoad(tempProps);
        } else {
            super.load(inStream);
        }
    }

    /**
     * Reads a property list (key and element pairs) from the input character stream in a simple line-oriented format. 
     * 
     * <p>Behaves exactly as {@link java.util.Properties#load(java.io.Reader)}
     * with the exception that trailing whitespace is trimmed on property values
     * if <tt>reader</tt> is an instance of <tt>FileReader</tt>.
     * 
     * @see java.util.Properties#load(java.io.Reader) }
     * @param reader the input character stream.
     * @throws IOException if an error occurred when reading from the input stream.
     */
    @Override
    public void load(Reader reader) throws IOException {
        if (reader instanceof FileReader) {
            // First read into temporary props using the standard way
            Properties tempProps = new Properties();
            tempProps.load(reader);
            // Now trim and put into target
            trimAndLoad(tempProps);
        } else {
            super.load(reader);
        }
    }

    private void trimAndLoad(Properties p) {
        for (Entry<Object, Object> entry : p.entrySet()) {
            if (entry.getValue() instanceof String) {
                put(entry.getKey(), trimTrailing((String) entry.getValue()));
            } else {
                put(entry.getKey(), entry.getValue());
            }
        }
    }

    /**
     * Trims trailing space or tabs from a string.
     *
     * @param str
     * @return
     */
    public static String trimTrailing(String str) {
        if (str != null) {
            // read str from tail until char is no longer whitespace
            for (int i = str.length() - 1; i >= 0; i--) {
                if ((str.charAt(i) != ' ') && (str.charAt(i) != '\t')) {
                    return str.substring(0, i + 1);
                }
            }
        }
        return str;
    }
}

Enregistrement des propriétés en XML

Stockage des propriétés dans un fichier XML

La manière dont vous stockez les fichiers de propriétés en tant que fichiers XML est très similaire à la manière dont vous les .properties tant que fichiers .properties . Juste au lieu d'utiliser le store() vous utiliseriez storeToXML() .

public void saveProperties(String location) throws IOException{
    // make new instance of properties
    Properties prop = new Properties();
    
    // set the property values
    prop.setProperty("name", "Steve");
    prop.setProperty("color", "green");
    prop.setProperty("age", "23");
    
    // check to see if the file already exists
    File file = new File(location);
    if (!file.exists()){
        file.createNewFile();
    }
    
    // save the properties
    prop.storeToXML(new FileOutputStream(file), "testing properties with xml");
}

Lorsque vous ouvrez le fichier, cela ressemblera à ceci.

capture d'écran du fichier créé

Chargement des propriétés à partir d'un fichier XML

Maintenant, pour charger ce fichier en tant que properties vous devez appeler le loadFromXML() au lieu du load() que vous utiliseriez avec les fichiers .propeties .

public static void loadProperties(String location) throws FileNotFoundException, IOException{
    // make new properties instance to load the file into
    Properties prop = new Properties();
    
    // check to make sure the file exists
    File file = new File(location);
    if (file.exists()){
        // load the file
        prop.loadFromXML(new FileInputStream(file));
        
        // print out all the properties
        for (String name : prop.stringPropertyNames()){
            System.out.println(name + "=" + prop.getProperty(name));
        }
    } else {
        System.err.println("Error: No file found at: " + location);
    }
}

Lorsque vous exécutez ce code, vous obtiendrez les éléments suivants dans la console:

age=23
color=green
name=Steve


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow