2009-09-16 5 views
34

java.util.Propertiesは、プロパティー・キーごとに1つの値を仮定しているようです。これは、java.util.Propertiesの複数の値

foo=1 
foo=2 

が期待されていないされ、

も、loadメソッドを提供し、多値プロパティ・シートのこの種のクラスは、ありますか?

+0

[ResourceBundle#getStringArrayを使用して取得できるようにプロパティファイルに値を指定するにはどうすればよいですか?](http://stackoverflow.com/questions/226050/how-do-i-specify-values- in-a-properties-file-so-they-can-be-retrieve-resoを使用して) –

答えて

60

試してみてください。

foo=1,2 

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

シンプルでエレガントな、ありがとう! – ClueMinus

+10

上記の行は、プロパティfooが見つからない場合にNullPointerExceptionをスローします。したがって、プロパティが存在するかどうかをチェックし、プロパティが必要な場合は例外をキャッチ/スローしてください。プロパティがオプションの場合、properties.getProperty( "foo"、 "").split( "、")はより安全な代替メソッドになります。 –

+2

@ lee-theobald:プロパティクラスをGroovyクラスにして、これを行うことができます: 'String [] foos = properties.getProperty(" foo ")?split( "、") 'とfooはNPEを取得する代わりにnullになります:) – rjohnston

20

java.util.Properties機能はかなり限られています。あなたがリストをサポートしたい場合、あなたはあなたのリストに任意の区切り文字を設定することができ、それにより

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

は、Apache Commonsの設定からPropertyConfigurationを試してみたい場合があります、それは自動的に分割します。あなたはまた、プロパティファイルで他の素晴らしいことをすることができます。例えば、

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

あなたは、このようにニックによって

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

これはプロパティファイルに対してのみ機能しますか?これはJavaの "-D"コマンドラインプロパティパラメータに対しても機能しますか? – David

4

正しい答えを、それを取得することができます。

それとも、あなたが各値に異なるサブネームを与えることができれば、あなたはあなたの特性になるかもしれない:

my.properties 

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

しかし、このアプローチを使うと、fooの主要なプロパティをfooのリスト/配列/コレクションにどのように捉えることができますか?サブネームとして表示されているので、プロパティを一度ルートオブジェクトとして取得し、そのサブネームをキーとして値を取得するためにサブネームを反復処理したいと思うでしょう。それはやっかいな部分です。個々のプロパティとしてアクセスするだけで簡単ですが、ほとんどの人は複数の値を持つプロパティに対してそのようにするつもりはありません。 – David

0

これは、loadメソッドが、Apacheを使用することができ、それらを格納する場所を提供することはありませんコモンズmultivaluemap:「MultiValueMapは、それがキーに複数の値を持つことができるように、別のマップを飾る」

これは、多くの場合、httpリクエストパラメータのための要件である

...

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html

0

あなたがより複雑な例を持っている場合は、以下を使用する可能性がありますに:あなたのコードで

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

あなたが検索する必要があります。

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); 
} 

は欠点:プロパティファイルを更新します。 * 2の値を削除すると、以下の値はすべて加算されません。改善するには、継続を使用してブレークを置き換え、許容されている最大限のペアに固執することができます。