0

直接来自这个API

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

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

4

1 回答 1

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方法的参数以在类路径上查找资源。对我来说,默认的 Locale 是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
于 2013-08-28T14:34:43.753 回答