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

Posted

技术标签:

【中文标题】如何在属性文件中指定值,以便可以使用 ResourceBundle#getStringArray 检索它们?【英文标题】:How do I specify values in a properties file so they can be retrieved using ResourceBundle#getStringArray? 【发布时间】:2010-09-18 13:41:03 【问题描述】:

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

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

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

key=value1
key=value2
key=value3

并以逗号分隔的列表:

key=value1,value2,value3

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

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

【问题讨论】:

【参考方案1】:

Properties 对象可以容纳 Objects,而不仅仅是 Strings。这往往会被遗忘,因为它们压倒性地用于加载 .properties 文件,因此通常只包含Strings。 The documentation 表示调用bundle.getStringArray(key) 等价于调用(String[]) bundle.getObject(key)。这就是问题所在:值不是String[],而是String

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

【讨论】:

谢谢,您提供的答案是我所怀疑的。我已经使用 split() 实现了一些东西,我只是希望我可以利用类库中已经存在的东西,而不是自己滚动。 感谢您的回答!我使用了一个简单的拆分来获取逗号后使用的间距(为了便于阅读)。我不得不使用更复杂的拆分,例如:***.com/questions/1396084/…【参考方案2】:
key=value1;value2;value3

String[] toArray = rs.getString("key").split(";");

【讨论】:

【参考方案3】:

只使用弹簧 - Spring .properties file: get element as an Array

相关代码:

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

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

【讨论】:

【参考方案4】:

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

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

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

    return new Object[][]

            "name",str1,
            "country","UK"                
    ;

【讨论】:

【参考方案5】:

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

【讨论】:

@JG:谢谢,我会在下一个项目中考虑 Commons Configuration。我喜欢它在多行上支持key : value1key : value2key : value3 以及逗号分隔的列表(以及在值中转义逗号的能力,这是我自己的版本不支持的)。 这是否仅适用于属性文件,或者这也适用于 Java“-D”命令行属性参数?【参考方案6】:

示例:

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;

【讨论】:

【参考方案7】:
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】:

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

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

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

我也做了一些谷歌搜索,但似乎没有一个答案明确指出 PropertyResourceBundle 不支持这一点。我想我看到了一个 apache commons 项目,它提供了一个 getStringArray() 方法来处理 key=value1,value2,value3,但我只会自己动手。谢谢。

以上是关于如何在属性文件中指定值,以便可以使用 ResourceBundle#getStringArray 检索它们?的主要内容,如果未能解决你的问题,请参考以下文章

Python如何删除numpy数组中指定值的元素

如何在 Maven 中指定额外的源/资源文件夹,以便 IDE 知道它们?

T-SQL - 有没有一种方法可以根据表中指定值的行数动态输出列?

java - 如何在Java文件中指定相对文件路径,以便将文件放入jar文件后仍然可以工作?

%in% 的对面:排除具有向量中指定值的行

php删除数组中指定值的元素