java.util.Properties中的多个值

时间:2009-09-16 11:49:39

标签: java properties

似乎java.util.Properties假设每个按键一个值。也就是说,

foo=1
foo=2

不是预期的,

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

5 个答案:

答案 0 :(得分:64)

尝试:

foo=1,2

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

答案 1 :(得分:20)

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

答案 2 :(得分:4)

尼克的正确答案。

或者,如果您可以为每个值指定不同的子名称,则可以使用以下属性:

    my.properties

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

答案 3 :(得分:0)

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

“MultiValueMap修饰了另一个地图,允许它为一个键提供多个值。”

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

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

答案 4 :(得分: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,则不会添加以下所有值。为了改进你可能想要用continue替换break并坚持允许的最大对。