首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否从ResourceBundle生成属性对象?

是否从ResourceBundle生成属性对象?
EN

Stack Overflow用户
提问于 2011-07-07 04:31:35
回答 3查看 1.6K关注 0票数 0

我得到了一个基于一堆.properties文件的“普通”Java PropertyResourceBundle。在某些情况下,基于正确转换的.properties文件而不是ResourceBundleProperties对象进行操作要方便得多。有没有一种方便的方法将ResourceBundle“转换”为Properties

我希望是这样的:

代码语言:javascript
运行
复制
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上获取密钥的方法是getStringgetObject。在程序中传递Properties对象并拉出字符串之前,更改该对象的位置非常容易。更改实际的方法调用是...没那么容易。当然,你几乎可以搜索和替换它,但是不是仅仅改变加载属性的一个类,我们必须触及每个单独的源文件。(是的,这里面有很多文本。)我们希望我们错过了一种方法,既可以使用ResourceBundle的多.properties后备机制,又不必重新连接整个应用程序。(甘道夫无缘无故地引用了一句话:“从来没有太多希望。只是愚蠢的希望。”)

EN

回答 3

Stack Overflow用户

发布于 2011-07-07 04:50:02

没有内置的方法可以做你想做的事情,但是正如你所说的,自己去做并不难:基本上有相同的接口,把键和值从bundle复制到属性是很容易的。

不过,这里有一个警告。尽管接口相似,但实现不同:资源包有一个继承模型,如果没有在foo_fr_FR.propertiesfoo_fr.properties中定义,则允许在foo.properties中返回值。因此,复制所有条目不会得到与从属性文件中加载的属性相同的属性。它将获得属性文件的条目及其所有父级的属性。但我猜您知道这一点,因为您正在谈论一堆属性文件。

您还没有说明为什么您更喜欢属性而不是ResourceBundle,所以很难给您一个更好的答案。

另一种解决方案是简单地自己加载属性:

代码语言:javascript
运行
复制
Properties props = new Properties();
properties.load(MyClass.class.getResourceAsStream("MyResources_" + locale + ".properties")

这样,您将只从特定的属性文件中获取条目。

票数 3
EN

Stack Overflow用户

发布于 2011-07-07 15:31:35

在none中有一个很好的理由: ResourceBundle旨在包含不同语言的属性,因此它将加载*和回退适当的文件-当您要求使用de-AT语言环境(德语、奥地利)的消息时,如果它能够找到一个或在其他情况下到您的基本属性文件(messages.properties),它将回退到德语。

我真的不知道你在这里的用例是什么(也许它只是可以用一种不同的方式实现?)但似乎唯一的方法是直接从属性文件中读取,不幸的是模仿我上面提到的机制(棘手的部分是葡萄牙语、巴西和繁体中文,它们不应该退回到它们的“默认”语言(分别是“pt”和"zh“))。

票数 3
EN

Stack Overflow用户

发布于 2017-05-18 18:06:07

另一种解决方案是对键进行迭代,并将所有对都放在一个属性对象中,您可以使用convertBundleToProperties

代码语言:javascript
运行
复制
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;
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6602566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档