我得到了一个基于一堆.properties文件的“普通”Java PropertyResourceBundle。在某些情况下,基于正确转换的.properties文件而不是ResourceBundle对Properties对象进行操作要方便得多。有没有一种方便的方法将ResourceBundle“转换”为Properties?
我希望是这样的:
Locale currentLocale = MagicLocaleFactory.getLocale();
ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
Properties myProperties = myResources.magicallyProduceAPropertiesObject();因此,myProperties对象的行为就像是从ResourceBundle.getBundle()找到的同一个.properties文件实例化的一样。
有几种方法可以“手动”做到这一点;例如,迭代ResourceBundle的键值对并将它们安装到一个新的Properties对象中,但我希望有一种更好的方法,或者至少是更短的方法。
编辑:
回答显而易见的“但是,为什么?”问题是:我们正在为i18n改造一个长期存在的桌面java程序。该程序已经在从由单个.properties文件支持的Properties对象中提取字符串。我们将单个文件替换为多个文件,并将Properties对象“提升”为资源包。问题在于,在Properties上获取密钥的方法是getProperty,而在ResourceBundle上获取密钥的方法是getString或getObject。在程序中传递Properties对象并拉出字符串之前,更改该对象的位置非常容易。更改实际的方法调用是...没那么容易。当然,你几乎可以搜索和替换它,但是不是仅仅改变加载属性的一个类,我们必须触及每个单独的源文件。(是的,这里面有很多文本。)我们希望我们错过了一种方法,既可以使用ResourceBundle的多.properties后备机制,又不必重新连接整个应用程序。(甘道夫无缘无故地引用了一句话:“从来没有太多希望。只是愚蠢的希望。”)
发布于 2017-05-18 18:06:07
另一种解决方案是对键进行迭代,并将所有对都放在一个属性对象中,您可以使用convertBundleToProperties
static Properties convertBundleToProperties(ResourceBundle resource) {
Properties properties = new Properties();
Enumeration<String> keys = resource.getKeys();
while (keys.hasMoreElements()) {
String key = keys.nextElement();
properties.put(key, resource.getString(key));
}
return properties;
}https://stackoverflow.com/questions/6602566
复制相似问题