【问题标题】:String value from properties file属性文件中的字符串值
【发布时间】:2016-12-23 14:23:46
【问题描述】:

我有一个属性(无法更改此文件),它看起来像:

aaa.bbb.ccc.first=my first value
aaa.bbb.ccc.second=my second value
aaa.bbb.ccc.third=my third value

如果我需要 java 类中的任何值,我会使用 i18n.getText("aaa.bbb.ccc.first"),但它仅适用于单个值。

问题是因为我不知道:

-值的名称

-aaa.bbb.ccc中有多少个值~

如何获取值 aaa.bbb.ccc~ 的列表?

【问题讨论】:

  • 所以没有办法解决我的问题?
  • aaa.bbb.ccc=firts, second, third 然后String str = i18n.getText("aaa.bbb.ccc"); 然后你做一些String.split 来分隔你的列表。
  • 我无法更改属性文件,只能在 java 中进行
  • 您总是可以使用Collection<String> propNames = properties.stringPropertyNames().stream().filter(k -> k.startsWith("aaa.bbb.ccc.")).collect(Collectors.toSet());,但正如其他人所指出的,属性文件不是提供具有分组结构的数据的好方法。

标签: java properties


【解决方案1】:

您可以使用MapFilter。使用MapFilter(Properties p, String prefix) 构造函数。

public void test() {
    Properties props = new Properties();
    props.put("aaa.bbb.ccc.first", "my first value");
    props.put("aaa.bbb.ccc.second", "my second value");
    props.put("aaa.bbb.ccc.third", "my third value");
    props.put("Other.props", "others");
    MapFilter<String> filtered = new MapFilter(props, "aaa.bbb.ccc.");
    for (Map.Entry<String, String> e : filtered.entrySet()) {
        System.out.println("Key: " + e.getKey() + " Value: " + e.getValue());
    }
    System.out.println(filtered);

}

【讨论】:

  • 属性文件随时可能发生变化,只要知道值在aaa.bbb.ccc.
【解决方案2】:

哈希映射不适用于您想做的那种查找:Triesradix trees 是。 Apache Commons Collections 中有 Patricia trie 数据结构(即二叉基数树)的实现:只需从您的 Map&lt;String, Whatever&gt; 创建一个 trie(您有一个很好的构造函数)并使用 prefixMap("aaa.bbb.ccc") 获得子图键具有该前缀的所有条目。

【讨论】:

    【解决方案3】:

    Properties 有一个方法 propertyNames()。您可以使用它来获取所有密钥,然后从那里做任何您想做的事情。

    【讨论】:

    • 这没有错,但远不是一个完整的答案。
    • 我试图在不为他编写所有代码的情况下将他引向正确的方向:)
    猜你喜欢
    • 2015-05-30
    • 2016-08-29
    • 1970-01-01
    • 2014-11-06
    • 2021-03-18
    • 2021-08-12
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多