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 に答える