代码之家  ›  专栏  ›  技术社区  ›  Rollerball

关于java中ResourceBundle的查询

  •  0
  • Rollerball  · 技术社区  · 11 年前

    直接从此处 API :

    否则,getBundle会尝试使用 生成的财产文件名。它从 通过将所有“.”字符替换为“/”和 附加字符串“.财产”。它试图查找“资源” 使用ClassLoader.getResource使用此名称。

    他们是什么意思 replacing all "." characters with "/" 什么是一个例子? 附言:我可以在末尾附加。财产。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Sotirios Delimanolis    11 年前

    假设您有一个名为

    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