【问题标题】:Multiple values in java.util.Propertiesjava.util.Properties 中的多个值
【发布时间】:2010-11-28 18:47:41
【问题描述】:

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

foo=1
foo=2

不是预期的,

这种多值属性表有没有类,也提供加载方法?

【问题讨论】:

标签: java properties


【解决方案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,则不会添加以下所有值。为了改进,您可能希望用 continue 替换 break 并坚持允许的最大对数。

【讨论】:

  • 您可以遍历所有以“source”开头的键,而不是在丢失的键上中止。 for (Entry prop :properies.entrySet()) { if (prop.getKey().startsWith("source")) { 做点什么}
【解决方案2】:

试试:

foo=1,2

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

【讨论】:

  • 如果未找到属性 foo,上述行将抛出 NullPointerException。因此,请确保检查该属性是否存在或在需要该属性时捕获/抛出异常。如果属性是可选的,那么 properties.getProperty("foo", "").split(",") 可能是更安全的选择。
  • @lee-theobald:让你的属性类成为 Groovy 类,你可以这样做:String[] foos = properties.getProperty("foo")?.split(",") 和 foo 将为 null 而不是获得 NPE :)
  • 如果数据项本身包含逗号怎么办?
  • @DavidBalažic 您需要使用替代正则表达式,允许将字符串属性拆分为其组成部分
  • @DavidBalažic 我尽可能地跳过逗号。尝试使用旧管道“|”它在数据中不常用。
【解决方案3】:

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

“MultiValueMap 装饰另一个地图,允许它有多个值作为键。”

这往往是对http请求参数的要求……

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

【讨论】:

    【解决方案4】:

    尼克的正确答案。

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

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

    【讨论】:

    • 但是使用这种方法,您如何将 foo 的所有主要属性抓取到 foo 的列表/数组/集合中?而且由于您已显示为子名称,因此可能会认为我们希望将属性作为根对象获取一次,然后按子名称作为键遍历子名称以获取它的值。这是更棘手的部分。仅将它们作为单个属性进行访问很简单,但大多数人不希望以这种方式访问​​多值属性。
    【解决方案5】:

    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
    

    【讨论】:

    • 这是否仅适用于属性文件,或者这也适用于 Java“-D”命令行属性参数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2016-06-06
    • 2011-01-01
    • 2013-03-01
    • 2010-10-26
    相关资源
    最近更新 更多