在java中查询ResourceBundle

时间:2013-08-28 13:28:02

标签: java io resourcebundle

直接来自API

  

否则,getBundle会尝试使用找到属性资源文件   生成的属性文件名。它从中生成路径名   候选捆绑名称通过替换所有“。”带有“/”和。的字符   附加字符串“.properties”。它试图找到一个“资源”   使用ClassLoader.getResource。使用此名称。

replacing all "." characters with "/"他们的意思是什么? PS:我可以在最后添加.properties。

1 个答案:

答案 0 :(得分:1)

假设您有一个名为

的包
com.yourgroup.bundles

包含名为

的文件
hello_en_US.properties

您必须指定以下任一项来加载包

ResourceBundle bundle = ResourceBundle.getBundle("com.yourgroup.bundles.hello");
ResourceBundle bundle = ResourceBundle.getBundle("com/yourgroup/bundles/hello");

基本上javadoc告诉你它如何将你传递给getBundle方法的参数转换为在类路径上查找资源。对我来说,默认的语言环境是en_US,所以

com.yourgroup.bundles.hello

转换为

com/yourgroup/bundles/hello_en_US.properties

然后,它可以使用ClassLoader来查找该资源。

如果正确映射其名称,它返回的ResourceBundle实现可能实际上是一个自定义类。请关注javadoc。否则,它只是一个Properties资源包。

神奇发生在ResourceBundle#newBundle(...)

String bundleName = toBundleName(baseName, locale); // baseName being 'com.yourgroup.bundles.hello' in my example above
...
final String resourceName = toResourceName(bundleName, "properties");

那就是

public final String toResourceName(String bundleName, String suffix) {
    StringBuilder sb = new StringBuilder(bundleName.length() + 1 + suffix.length());
    sb.append(bundleName.replace('.', '/')).append('.').append(suffix);
    return sb.toString();
}

....

URL url = classLoader.getResource(resourceName);
...
bundle = new PropertyResourceBundle(stream); // stream comes from url