java.util.Properties中的多个值

似乎java.util.Properties假设每个Propery键有一个值。 那是,

foo=1 foo=2 

没有预料到,

是否有这种多值属性表的类,它也提供了负载方法?

尝试:

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

java.util.Properties函数相当有限。 如果您需要支持列表,您可能需要从Apache Commons Configuration中尝试PropertyConfiguration,

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

有了它,你可以设置任何分隔符到你的列表,它会自动为你分割。 你也可以在属性文件中做其他奇特的事情。 例如,

 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 

尼克正确的答案。

或者,如果您可以为每个值赋予不同的子名称,则可以使您的属性成为:

  my.properties foo.title=Foo foo.description=This a big fat foo. 

这不会提供加载方法,而是一个存储他们的地方,你可以使用apache的commons multivaluemap:

“一个MultiValueMap装饰另一个地图,允许它有一个以上的键值。”

这通常是http请求参数的要求…

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

如果你有更复杂的例子,你可以使用下面的代码:

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

在你的代码中,你将不得不search:

 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,则不会添加以下所有值。 为了改善您可能想要继续replace中断,并坚持最大允许的对。