2009-09-16 10 views
34

Il semble que java.util.Properties suppose une valeur par clé de propriété. C'est,Plusieurs valeurs dans java.util.Properties

foo=1 
foo=2 

ne devrait pas,

Y at-il une classe pour ce genre de feuille de propriétés multi-valeur, qui fournit également la méthode de charge?

+0

duplication possible de [Comment spécifier les valeurs dans un fichier de propriétés afin qu'elles puissent être récupérées à l'aide de ResourceBundle # getStringArray?] (Http://stackoverflow.com/questions/226050/how-do-i-specify-values- in-a-properties-file-so-they-can-be-retrieved-using-reso) –

Répondre

60

Essayez:

foo=1,2 

String[] foos = properties.getProperty("foo").split(","); 
+1

Simple et élégant, merci! – ClueMinus

+10

La ligne ci-dessus lancera une exception NullPointerException si la propriété foo est introuvable. Donc, assurez-vous de vérifier la propriété existe ou attraper/jeter l'exception si la propriété est requise. Si la propriété est optionnelle, alors properties.getProperty ("foo", "") .split (",") pourrait être une alternative plus sûre. –

+2

@ lee-theobald: donne à ta classe de propriétés une classe Groovy et tu peux faire ceci: 'String [] foos = properties.getProperty (" foo ") ?.split (",") 'et foo sera null au lieu d'obtenir un NPE :) – rjohnston

20

La fonction java.util.Properties est assez limitée. Si vous voulez soutenir la liste, vous pouvez essayer PropertyConfiguration de configuration Apache Commons,

http://commons.apache.org/configuration/userguide/howto_properties.html#Using_PropertiesConfiguration

Avec elle, vous pouvez définir des délimiteurs à votre liste et il sera divisé automatiquement pour vous. Vous pouvez également faire d'autres choses fantaisistes dans le fichier de propriétés. Par exemple,

foo=item1, item2 
bar=${foo}, item3 
number=123 

Vous pouvez le récupérer comme ça,

Configuration config = new PropertiesConfiguration("your.properties"); 
String[] items = config.getStringArray("bar"); // return {"item1", "item2", "item3"} 
int number = config.getInt("number", 456); // 456 is default value 
+0

Est-ce que cela fonctionne uniquement pour les fichiers de propriétés, ou cela peut-il aussi fonctionner pour les paramètres de propriétés de la ligne de commande Java "-D"? – David

4

réponse correcte par Nick.

Ou, si vous pouvez donner un autre sous-nom à chaque valeur, vous pourriez avoir vos propriétés être:

my.properties 

    foo.title=Foo 
    foo.description=This a big fat foo. 
+1

Mais en utilisant cette approche, comment voulez-vous saisir toutes les propriétés principales de foo, dans une liste/tableau/collection de foo? Et puisque vous avez montré comme sous-noms, on pourrait penser que nous aimerions attraper la propriété une fois en tant qu'objet racine, puis parcourir les sous-noms par le sous-nom en tant que clé pour obtenir sa valeur. C'est une partie plus délicate. Simplement y accéder en tant que propriétés individuelles est simple, mais la plupart des gens ne cherchent pas à le faire de cette façon pour les propriétés à valeurs multiples. – David

0

Si vous avez un exemple plus complexe, vous pouvez utiliser les éléments suivants:

# pairs of properties 
source1=foo 
target1=bar 
source2=anotherFoo 
target2=regardingBar 
source3= ... 

Dans votre code, vous devrez rechercher:

Map<String, String> myMap = new HashMap<>(); 
for (int i=1; i<max; i++) { 
    String source = properties.get("source" + i); 
    String target = properties.get("target" + i); 
    if (source == null || target == null) { 
    break; 
    } 
    myMap.put(source, target); 
} 

Inconvénient: mise à jour du fichier de propriétés. Si vous supprimez les valeurs * 2, toutes les valeurs suivantes ne seront pas ajoutées. Pour améliorer vous pourriez vouloir remplacer la pause avec un continuer et coller à un maximum de paires autorisées.

Questions connexes