32

我正在尝试使用从属性文件ResourceBundle#getStringArray中检索 a 。String[]文档中对此方法的描述如下:

从此资源包或其父资源包中获取给定键的字符串数组。

但是,我尝试将属性文件中的值存储为多个单独的键/值对:

key=value1
key=value2
key=value3

并作为逗号分隔的列表:

key=value1,value2,value3

但这些都不能使用ResourceBundle#getStringArray.

您如何在属性文件中表示一组键/值对,以便可以使用 检索它们ResourceBundle#getStringArray

4

9 回答 9

33

一个Properties对象可以持有Objects,而不仅仅是Strings。这往往会被遗忘,因为它们绝大多数用于加载 .properties 文件,因此通常只包含Strings。该文档表明调用bundle.getStringArray(key)等效于调用(String[]) bundle.getObject(key)。这就是问题所在:值不是 a String[],而是 a String

我建议以逗号分隔的格式存储它并调用split()该值。

于 2008-10-22T15:03:43.147 回答
7

您可以使用Commons Configuration,它具有方法getListgetStringArray允许您检索逗号分隔的字符串列表。

于 2009-08-18T00:57:01.500 回答
5

嗯,看起来这是一个常见问题,来自这里这里的线程。

似乎您不使用该方法并自己解析数组的值,或者您编写自己的 ResourceBundle 实现并自己做:(。也许有一个 apache commons 项目用于此...

从 JDK 源代码来看,PropertyResourceBundle 似乎不支持它。

于 2008-10-22T15:01:56.083 回答
3

我不相信从属性文件加载的 ResourceBundles 是不可能的。PropertyResourceBundle 利用 Properties 类来加载属性文件。Properties 类将属性文件加载为一组 String->String 映射条目,并且不支持提取 String[] 值。

调用 ResourceBundle.getStringArray 只是调用 ResourceBundle.getObject,将结果转换为 String[]。由于 PropertyResourceBundle 只是将它交给它从文件中加载的 Properties 实例,因此您永远无法让它与当前的库存 PropertyResourceBundle 一起使用。

于 2008-10-22T15:06:04.593 回答
1

例子:

mail.ccEmailAddresses=he@anyserver.at, she@anotherserver.at

..

myBundle=PropertyResourceBundle.getBundle("mailTemplates/bundle-name", _locale);

..

public List<String> getCcEmailAddresses() 
{
    List<String> ccEmailAddresses=new ArrayList<String>();
    if(this.myBundle.containsKey("mail.ccEmailAddresses"))
    {
        ccEmailAddresses.addAll(Arrays.asList(this.template.getString("mail.ccEmailAddresses").split("\\s*(,|\\s)\\s*")));// 1)Zero or more whitespaces (\\s*) 2) comma, or whitespace (,|\\s) 3) Zero or more whitespaces (\\s*)
    }       
    return ccEmailAddresses;
}
于 2013-02-04T16:49:39.283 回答
1

我已经尝试过了,并且可以找到一种方法。一种方法是定义 ListresourceBundle 的子类,然后定义 String[] 类型的实例变量并将值分配给键.. 这是代码

@Override
protected Object[][] getContents() {
    // TODO Auto-generated method stub

    String[] str1 = {"L1","L2"};

    return new Object[][]{

            {"name",str1},
            {"country","UK"}                
    };
}
于 2014-12-27T13:56:32.387 回答
1

只需使用 spring - Spring .properties 文件:将元素作为数组获取

相关代码:

base.module.elementToSearch=1,2,3,4,5,6

@Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
于 2015-04-27T16:55:14.747 回答
0
public String[] getPropertyStringArray(PropertyResourceBundle bundle, String keyPrefix) {
    String[] result;
    Enumeration<String> keys = bundle.getKeys();
    ArrayList<String> temp = new ArrayList<String>();

    for (Enumeration<String> e = keys; keys.hasMoreElements();) {
        String key = e.nextElement();
        if (key.startsWith(keyPrefix)) {
            temp.add(key);
        }
    }
    result = new String[temp.size()];

    for (int i = 0; i < temp.size(); i++) {
        result[i] = bundle.getString(temp.get(i));
    }

    return result;
}
于 2008-10-23T11:08:59.360 回答
-1
key=value1;value2;value3

String[] toArray = rs.getString("key").split(";");
于 2015-05-12T03:29:24.820 回答