如何在属性文件中指定值,以便可以使用 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
对象可以容纳 Object
s,而不仅仅是 String
s。这往往会被遗忘,因为它们压倒性地用于加载 .properties 文件,因此通常只包含String
s。 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,它有方法getList
和getStringArray
,允许您检索逗号分隔的字符串列表。
【讨论】:
@JG:谢谢,我会在下一个项目中考虑 Commons Configuration。我喜欢它在多行上支持key : value1
、key : value2
、key : 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 检索它们?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Maven 中指定额外的源/资源文件夹,以便 IDE 知道它们?
T-SQL - 有没有一种方法可以根据表中指定值的行数动态输出列?