【问题标题】:Inquiry about ResourceBundle in java在java中查询ResourceBundle
【发布时间】:2013-08-31 14:39:15
【问题描述】:

直接来自这个API

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

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

【问题讨论】:

    标签: java io resourcebundle


    【解决方案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 方法的参数以在您的类路径中查找资源。对我来说,默认的语言环境是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
    

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 2017-05-21
      • 2012-06-02
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      相关资源
      最近更新 更多