2

我有一个 EJB 2.1 应用程序,它引用一个属性文件来读取一个值。属性文件的文件名定义为

private static final String CONFIG_DIRECTORY = "config.";
private static final String PROPERTIES_FILE = CONFIG_DIRECTORY + "myapp";

要从属性文件加载和读取属性,请进行以下调用,将 PROPERTIES_FILE 作为 propertyFileName 的名称传递

this.getProperties(PROPERTIES_FILE);

getProperties方法使用 ResourceBundle 加载属性文件,如下所示。

public Properties getProperties (String propertyFileName) {
        Properties properties = new Properties();
        ResourceBundle resourceBundle = ResourceBundle.getBundle(propertyFileName);
        Enumeration<String> keys = resourceBundle.getKeys();

        while (keys.hasMoreElements()) {
            String key = (String)keys.nextElement();
            String value = resourceBundle.getString(key);
            properties.put(key, value);
        }
        return properties;
    }

现在我花了很长时间试图在应用程序的文件系统中的任何地方找到一个名为 config.myapp 的文件,但它不存在。我什至在整个文件系统中搜索了该文件,但它不存在。我查看了所有文件夹、jar 文件等,但找不到名为 config.myapp 的文件

在应用程序的根目录中有一个名为“config”的文件夹,在该文件夹中有一个名为的文件,该文件myapp.properties具有应用程序正在读取的属性。可能config.myapp是实际上指的是config/myapp.properties文件吗?如果是这样,那是如何工作的?不知何故ResourceBundle翻译config.myapp成?config/myapp.properties

4

3 回答 3

2

用斜杠替换点并附加 .properties 是预期的行为。从文档ResourceBundle.getBundle

否则,getBundle 会尝试定位属性资源文件。它通过替换所有“。”从候选包名称生成路径名称。带有“/”的字符并附加字符串“.properties”。它尝试使用 ClassLoader.getResource 查找具有此名称的“资源”。

于 2012-12-31T02:26:18.893 回答
1

是的,当您使用时

ResourceBundle resourceBundle = ResourceBundle.getBundle(propertyFileName)

无需通过扩展名,也可以将路径作为“文件夹名.文件名”传递

ResourceBundle 将负责这些转换。

于 2012-12-31T02:26:54.307 回答
1

ResourceBundle.getBundle() 从您的类路径加载,它执行复杂的逻辑来解析文件(资源)属性名称。是的,它在最后添加了 .properties 并使用了一个包

简而言之,您传递给 getBundle() 的字符串被调用basename,逻辑是:

baseName 参数应该是一个完全限定的类名。但是,为了与早期版本兼容,Sun 的 Java SE 运行时环境不验证这一点,因此可以通过指定路径名(使用“/”)而不是完全限定的类名(使用“.”)来访问 PropertyResourceBundles .

因此,在您的情况下,如果您传递字符串“config.Myapp”,ResourceBundle 将尝试从您的类路径加载这些资源之一(假设您具有 en_US 语言环境):

  1. config.MyResources.class
  2. /config/Myapp.properties"
  3. /config/Myapp_en.properties
  4. config.Myapp_en_US.class
  5. /config/Myapp_en_US.properties

这是因为 ResourceBundle 旨在用于国际化 (i18n),而不是用于配置。

如果可以的话,我建议你看看我的小库以使用 java 属性:owner API。(希望这不会被视为垃圾邮件)

于 2012-12-31T02:34:02.157 回答