如何在属性文件中指定值,以便可以使用ResourceBundle#getStringArray检索它们?

时间:2008-10-22 14:43:41

标签: java resourcebundle

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

  

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

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

key=value1
key=value2
key=value3

以逗号分隔的列表:

key=value1,value2,value3

但这些都不能使用ResourceBundle#getStringArray检索。

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

9 个答案:

答案 0 :(得分:32)

Properties对象可以包含 Object s ,而不仅仅是String s。这往往被遗忘,因为它们绝大多数用于加载.properties文件,因此通常只包含String个。 The documentation表示调用bundle.getStringArray(key)等同于调用(String[]) bundle.getObject(key)。这就是问题:价值不是String[],而是String

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

答案 1 :(得分:7)

您可以使用Commons Configuration,其中包含方法getListgetStringArray,可让您检索逗号分隔字符串列表。

答案 2 :(得分:4)

嗯,从线程herehere看起来这是一个常见问题。

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

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

答案 3 :(得分:2)

示例:

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;
}

答案 4 :(得分:1)

我不相信从属性文件加载的ResourceBundles可以实现这一点。 PropertyResourceBundle利用Properties类来加载属性文件。 Properties类将属性文件作为一组String-&gt; String映射条目加载,并且不支持拉出String []值。

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

答案 5 :(得分:1)

只需使用spring - Spring .properties file: get element as an Array

相关代码:

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

@Value("${base.module.elementToSearch}")
  private String[] elementToSearch;

答案 6 :(得分:1)

List

答案 7 :(得分: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;
}

答案 8 :(得分:0)

我试过这个并找到了办法。 一种方法是定义ListresourceBundle的子类,然后定义String []类型的实例变量 并将值赋给键..这是代码

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

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

    return new Object[][]{

            {"name",str1},
            {"country","UK"}                
    };
}