我有一个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语言环境(:
- config.MyResources.class
- /config/Myapp.properties">
- /config/Myapp_en.properties
- config.Myapp_en_US.class
- /config/Myapp_en_US.properties
这是因为ResourceBundle旨在用于国际化(i18n(,而不是用于配置。
如果可以的话,我建议您看看我的小库,以便使用java属性:所有者API。(希望这不会被视为垃圾邮件(