java中ResourceBundle的查询

java中ResourceBundle的查询,java,io,resourcebundle,Java,Io,Resourcebundle,直接由此: 否则,getBundle将尝试使用查找属性资源文件 生成的属性文件名。它从 通过将所有“.”字符替换为“/”和 追加字符串“.properties”。它试图找到一个“资源” 使用ClassLoader.getResource使用此名称 将所有“.”字符替换为“/”是什么意思? 附言:我同意在结尾追加.properties。假设您有一个名为 com.yourgroup.bundles 包含名为 hello_en_US.properties 您必须指定以下任一项才能加载捆绑包 Res

直接由此:

否则,getBundle将尝试使用查找属性资源文件 生成的属性文件名。它从 通过将所有“.”字符替换为“/”和 追加字符串“.properties”。它试图找到一个“资源” 使用ClassLoader.getResource使用此名称

将所有“.”字符替换为“/”
是什么意思?
附言:我同意在结尾追加.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(…)

这很简单

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
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