【发布时间】:2010-11-28 18:47:41
【问题描述】:
似乎 java.util.Properties 假定每个属性键有一个值。也就是说,
foo=1
foo=2
不是预期的,
这种多值属性表有没有类,也提供加载方法?
【问题讨论】:
标签: java properties
似乎 java.util.Properties 假定每个属性键有一个值。也就是说,
foo=1
foo=2
不是预期的,
这种多值属性表有没有类,也提供加载方法?
【问题讨论】:
标签: java properties
如果您有一个更复杂的示例,您可以使用以下内容:
# 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 并坚持允许的最大对数。
【讨论】:
试试:
foo=1,2
String[] foos = properties.getProperty("foo").split(",");
【讨论】:
String[] foos = properties.getProperty("foo")?.split(",") 和 foo 将为 null 而不是获得 NPE :)
这不会提供加载方法,而是提供存储它们的地方,您可以使用 apache commons multivaluemap:
“MultiValueMap 装饰另一个地图,允许它有多个值作为键。”
这往往是对http请求参数的要求……
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html
【讨论】:
尼克的正确答案。
或者,如果您可以为每个值指定不同的子名称,您的属性可以是:
my.properties
foo.title=Foo
foo.description=This a big fat foo.
【讨论】:
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
【讨论】: