227 votes

Comment utiliser les fichiers de propriétés Java ?

Je dispose d'une liste de paires clé/valeur de valeurs de configuration que je souhaite stocker sous forme de fichiers de propriétés Java, puis charger et parcourir par itération.

Questions :

  • Dois-je stocker le fichier dans le même paquet que la classe qui les chargera, ou y a-t-il un emplacement spécifique où il doit être placé ?
  • Le fichier doit-il se terminer par une extension spécifique ou bien est-il .txt OK ?
  • Comment puis-je charger le fichier dans le code
  • Et comment puis-je itérer à travers les valeurs à l'intérieur ?

254voto

Zed Points 27408

Vous pouvez passer un InputStream à la propriété, de sorte que votre fichier peut se trouver à peu près n'importe où et être appelé n'importe comment.

Properties properties = new Properties();
try {
  properties.load(new FileInputStream("path/filename"));
} catch (IOException e) {
  ...
}

Iterate comme :

for(String key : properties.stringPropertyNames()) {
  String value = properties.getProperty(key);
  System.out.println(key + " => " + value);
}

0 votes

Quelle valeur est renvoyée lorsque la clé n'est pas présente dans le fichier de propriétés ?

2 votes

@MitakshGupta Si une propriété avec le nom que vous avez passé n'est pas trouvée dans le fichier ou dans la liste des propriétés par défaut, il retourne null . Voir Javadoc

3 votes

Comment cela se compare-t-il avec properties.load(PropertiesReader.class.getResourceAsStream("‌​/properties.properti‌​es")); c'est-à-dire, getResourceAsStream contre FileInputStream ? pour et contre ?

81voto

Jon Skeet Points 692016
  • Vous peut stocker le fichier où vous voulez. Si vous voulez le garder dans votre fichier jar, vous devrez utiliser Class.getResourceAsStream() o ClassLoader.getResourceAsStream() pour y accéder. Si c'est sur le système de fichiers, c'est un peu plus facile.

  • N'importe quelle extension convient, bien que l'extension .properties soit plus courante d'après mon expérience.

  • Chargez le fichier en utilisant Properties.load en passant dans un InputStream ou un StreamReader si vous utilisez Java 6. (Si vous sont en utilisant Java 6, j'utiliserais probablement UTF-8 et un Reader au lieu de l'encodage ISO-8859-1 par défaut pour un flux).

  • Itérer à travers elle comme vous le feriez à travers un normal Hashtable (qui Properties dérive de), par exemple en utilisant keySet() . Alternativement, vous pouvez utiliser l'énumération retournée par propertyNames() .

1 votes

Merci Jon, la prochaine fois que je chercherai quelque chose sur Joda, tu répondras aussi à cette question.

27voto

Fabian Steeg Points 24261

Si vous placez le fichier de propriétés dans le même paquet que la classe Foo, vous pouvez facilement le charger avec

new Properties().load(Foo.class.getResourceAsStream("file.properties"))

Étant donné que Properties étend Hashtable, vous pouvez itérer sur les valeurs de la même manière que vous le feriez dans un Hashtable.

Si vous utilisez l'extension *.properties, vous pouvez obtenir le support d'un éditeur, par exemple Eclipse a un éditeur de fichiers de propriétés.

5 votes

Vous peut mais je n'aime pas stocker les fichiers de propriétés dans le même paquet. Vous vous retrouvez avec des fichiers de propriétés éparpillés un peu partout dans votre application. Je préfère de loin stocker tous les fichiers de propriétés dans la racine de l'application, et les charger en tant que "class.getResourceAsStream(")". \file.properties ")" ou à un autre endroit connu.

0 votes

Nate, c'est vrai. Cependant, dans certains scénarios, l'emplacement du déploiement n'est pas connu (par exemple, tous les éléments de votre composant particulier sont regroupés dans une archive). Dans de tels cas, il peut être assez pratique de dire "c'est avec cette classe, où qu'elle se trouve". De plus, pour éviter de disperser les fichiers partout, un seul paquet de configuration peut être utilisé pour tous les fichiers de propriété.

1 votes

Fabian, ces deux cas fonctionnent avec mon commentaire - il est basé sur le classpath - pas le système de fichiers.

12voto

AVD Points 57984

Il existe de nombreuses façons de créer et de lire properties des fichiers :

  1. Stockez le fichier dans le même paquet.
  2. Recommander .properties Cependant, vous pouvez choisir votre propre extension.
  3. Utilisez ces classes situées à java.util paquet => Properties , ListResourceBundle , ResourceBundle classes.
  4. Pour lire les propriétés, utilisez les méthodes iterator ou enumerator ou directes de Properties o java.lang.System classe.

ResourceBundle classe :

 ResourceBundle rb = ResourceBundle.getBundle("prop"); // prop.properties
 System.out.println(rb.getString("key"));

Properties classe :

Properties ps = new Properties();
ps.Load(new java.io.FileInputStream("my.properties"));

0 votes

Bonjour AVD, pourquoi avons-nous besoin .properties Qu'est-ce qui ne va pas avec l'extension '.txt' ? Veuillez m'aider.

0 votes

@atishshimpi Pas nécessaire lorsque l'on travaille avec le type Properties mais obligatoire pour ResourceBundle - lire doc-. docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html

5voto

Alberto Zaccagni Points 11478

Ceci charge le fichier de propriétés :

Properties prop = new Properties();
InputStream stream = ...; //the stream to the file
try {
  prop.load(stream);
} finally {
  stream.close();
}

J'ai l'habitude de placer le fichier .properties dans un répertoire où se trouvent tous les fichiers de configuration, je ne le place pas avec la classe qui y accède, mais il n'y a pas de restrictions ici.

Pour le nom... J'utilise .properties pour des raisons de verbosité, je ne pense pas que vous devriez le nommer .properties si vous ne le voulez pas.

0 votes

Cependant, certaines "extensions" de fichiers de propriétés supposent l'extension .properties - par exemple ResourceBundle utilisé dans I18N.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X