【问题标题】:Properties vs Resource Bundle属性与资源包
【发布时间】:2011-10-22 03:32:04
【问题描述】:

我阅读了有关属性和资源包的信息。但我无法区分这些。何时使用属性文件以及何时使用资源包。

要加载属性文件,请使用以下代码

Properties tempProp = new Properties();
FileInputStream propsFile = new FileInputStream(xyz.properties);
tempProp.load(propsFile);

加载资源包

ResourceBundle labels =
    ResourceBundle.getBundle("xyz", currentLocale);
Enumeration bundleKeys = labels.getKeys();

在这两种情况下(在资源包和属性中)我们都使用属性文件。我发现的一个区别是,为了存储应用程序特定的数据,我们使用属性文件,而要使用 i18n 数据,我们使用资源包。我不知道我是对还是错。

我想知道以上两个的用途。这两者有什么区别。

【问题讨论】:

  • 你是 100% 正确的。 ResourceBundle 对象包含特定于语言环境的对象。

标签: java


【解决方案1】:

是的,你的想法是正确的。

资源包没有使用属性文件 - 它只是一种实现 (PropertyResourceBundle)。属性文件实际上只是一个字符串到字符串的映射 - 可以用于 i18n,但不是必须的。

ResourceBundle 为您提供了一种一致的方式来为特定语言环境请求适当的对象(通常是字符串),并带有回退等。这通常但并非总是由每种语言的单独属性文件支持。

所以是的:如果你正在处理 i18n,你应该使用ResourceBundle;如果您只需要在文本文件中保存字符串到字符串的映射,可以直接使用Properties

【讨论】:

  • 只使用 ResourceBundle 获取属性可以吗?
  • @ChristianVielma:不清楚你的意思。如果你不想要本地化的资源,ResourceBundle 是不合适的。
  • @Jon_Skeet 感谢您的快速回答,我决定再解释一下自己:*.com/questions/14883000/…
【解决方案2】:

ResourceBundle 有助于加载特定于语言环境的属性。如果每个区域设置的属性文件不同,例如 DE、CN 等,ResourceBundle 将加载适当的区域设置特定文件。

【讨论】:

    【解决方案3】:
    1. 通常用于配置文件的属性,不是为国际化 (i18n) 文件设计的。比如 log4j.properties 或者作为你自己的配置文件。
    2. ResourceBundle 用于国际化(i18n),ResourceBundle 的“魔力”不仅是键值对,还可以使用相同的键设置特定的 Locale(语言、地区/国家、变体)。

    所以,是的。这取决于你需要什么。

    【讨论】:

      【解决方案4】:

      资源包:始终将您的属性文件视为类路径的一部分。如果您部署项目,属性文件实际上会进入实际部署。

      属性类加载属性文件,但属性文件不一定在类路径中,或者不应该是部署文件的一部分。它可能在操作系统的某个位置或某个文件夹中。

      【讨论】: