似乎java.util.Properties假设每个按键一个值。也就是说,
foo=1
foo=2
不是预期的,
是否有这类多值属性表的类,它还提供了加载方法?
答案 0 :(得分:64)
尝试:
foo=1,2
String[] foos = properties.getProperty("foo").split(",");
答案 1 :(得分:20)
java.util.Properties函数非常有限。如果您需要支持列表,可能需要从Apache Commons Configuration尝试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
答案 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并坚持允许的最大对。