java.util.Properties 中的多个值

问题描述 投票:0回答:5

java.util.Properties 似乎假定每个属性键都有一个值。 也就是说,

foo=1
foo=2

不是预期的,

有没有这种多值属性表的类,也提供了load方法?

java properties
5个回答
72
投票

尝试:

foo=1,2

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

23
投票

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

4
投票

尼克的正确答案。

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

    my.properties

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

1
投票

如果您有更复杂的示例,您可以使用以下内容:

# 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,则不会添加以下所有值。为了改进,您可能需要用继续替换中断,并坚持最大允许对数。


0
投票

这不会提供加载方法,而是提供存储它们的位置,您可以使用 apache commons multivaluemap:

“MultiValueMap 装饰另一个映射,允许它的键具有多个值。”

这往往是http请求参数的要求...

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

© www.soinside.com 2019 - 2024. All rights reserved.