PropertyResourceBundle与ListResourceBundle

时间:2016-01-26 13:51:36

标签: java localization

尝试使用以下代码在Java 8中加载TestResourceBundle.properties文件时:

ResourceBundle resources = ResourceBundle.getBundle("TestResourceBundle");

我意识到如果在classpath中存在一个具有相同名称的ListResourceBundle类(TestResourceBundle.class),如下所示:

public class TestResourceBundle extends ListResourceBundle {

    public Object[][] getContents() {
        return contents;
    }

    private Object[][] contents = {
            { "Test", "Value2" }
    };
}

ListResourceBundle类它始终比属性文件具有更高的优先级,最后加载了ListResourceBundle类。

这是标准行为吗?

如果我想加载属性文件资源包,我该怎么办?我不知道类路径中是否存在具有相同名称的ListResourceBundle?

如何确保始终加载属性文件而不是具有相同名称的资源包类文件?

1 个答案:

答案 0 :(得分:1)

在ResourceBundle.Control类中,有一个FORMAT_DEFAULT列表,它总是为类资源包提供比属性文件更高的优先级:

 public static final List<String> FORMAT_DEFAULT
            = Collections.unmodifiableList(Arrays.asList("java.class",
                                                         "java.properties"));

我们可以改变覆盖ResourceBundle.Control类的getFormats()方法的优先级排序,如下面的代码所示:

 ResourceBundle resources = ResourceBundle.getBundle("TestResourceBundle", new ResourceBundle.Control() {

                @Override
                public List<String> getFormats(String baseName) {

                    if (baseName == null) {
                        throw new NullPointerException();
                    }

                    return Collections.unmodifiableList(Arrays.asList("java.properties", "java.class"));
                }

            });