直接来自API:
否则,getBundle会尝试使用找到属性资源文件 生成的属性文件名。它从中生成路径名 候选捆绑名称通过替换所有“。”带有“/”和。的字符 附加字符串“.properties”。它试图找到一个“资源” 使用ClassLoader.getResource。使用此名称。
replacing all "." characters with "/"
他们的意思是什么?
PS:我可以在最后添加.properties。
答案 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