ResourceBundle-当文件系统中不存在属性文件时,无法计算如何读取该文件



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

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

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

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

用斜线替换点并附加.properties是预期的行为。来自ResourceBundle.getBundle:的文档

否则,getBundle将尝试查找属性资源文件。它通过替换所有"."个字符加上"/",并附加字符串".properties"。它尝试使用查找具有此名称的"资源"ClassLoader.getResource.

使用时是

ResourceBundle resourceBundle = ResourceBundle.getBundle(propertyFileName)

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

ResourceBundle将负责这些转换。

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属性:所有者API。(希望这不会被视为垃圾邮件(

相关内容

  • 没有找到相关文章

最新更新