直接来自此API


否则,getBundle尝试使用以下命令查找属性资源文件
生成的属性文件名。它从
替换所有“。”作为候选包名称。带有“ /”的字符和
附加字符串“ .properties”。它试图找到一个“资源”
使用ClassLoader.getResource使用此名称。


它们对replacing all "." characters with "/"表示什么意思?
PS:我可以在结尾附加.properties。

最佳答案

假设您有一个名为

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

10-07 23:59