确定在Java8中使用哪个资源包

确定在Java8中使用哪个资源包,java,resourcebundle,Java,Resourcebundle,我有3个资源包(RB)属性文件:RB\u en、RB\u fr和RB。我将默认区域设置为“en_US”,现在我使用getBundle(“RB”,new Locale(“fr”)获取键“key1”的值。我知道Java将首先查找属性文件RB_fr,但是如果在RB_fr中找不到键“key1,那么它将继续查找哪个顺序?RB\u en文件或RB文件 下面是一些演示代码: RB.properties: 键1=值b RB_en.属性: 键1=值b_en RB_fr.properties:key2=值RB_fr

我有3个资源包(RB)属性文件:
RB\u en、RB\u fr和RB
。我将默认区域设置为“
en_US
”,现在我使用
getBundle(“RB”,new Locale(“fr”)
获取键“key1”的值。我知道Java将首先查找属性文件RB_fr,但是如果在
RB_fr
中找不到键“key1,那么它将继续查找哪个顺序?
RB\u en
文件或
RB
文件

下面是一些演示代码:

RB.properties: 键1=值b

RB_en.属性: 键1=值b_en

RB_fr.properties:key2=值RB_fr

 Locale fr = new Locale("fr");
 Locale.setDefault(new Locale("en", "US"));
 ResourceBundle b = ResourceBundle.getBundle("RB", fr);
 b.getString("key1");

我读过一本书,OCP Java SE 8程序员II,它说顺序是
RB\u fr->RB\u en->RB
。但是当我运行一个测试时,它显示的顺序是
RB\u fr->RB
,而
RB\u en
甚至没有考虑。所以这让我有点困惑,谁能解释一下哪个顺序是正确的吗?

您必须区分丢失的捆绑包和丢失的密钥

您首先使用请求法语资源包。此查找确实如本书和相应的javadoc中所述:

getBundle使用基本名称、指定的区域设置和默认值 locale(从locale.getDefault获得)生成 候选包名称

然后,getBundle迭代候选bundle名称,以找到它可以实例化实际资源bundle的第一个名称

由于存在
RB_fr.properties
,它将查找并实例化该属性

然后使用请求键
key1
的值。但是除了
getBundle
之外,它没有默认语言环境的回退。它只在当前包和任何父包中查找:

从该资源束或其父级之一获取给定密钥的字符串

法语包的父包是基本包(即,
RB.properties
),这解释了为什么您看不到英语值(父链在上面链接的
getBundle
的javadoc中也有详细解释)

如果您正在寻找德国资源包,您将观察到预期的行为:

ResourceBundle b = ResourceBundle.getBundle("RB", new Locale("de"));
b.getString("key1"); // valueRB_en

在这种情况下,
getBundle
将找不到任何
RB\u de.properties
并返回到
RB\u en.properties
,其中存在并将返回
key1

您可以向我们展示您的测试代码吗?顺序实际上应该和书中描述的一样。你认为你的默认区域设置是
en_US
还是你知道?嗨,我把我的默认区域设置为'en_US'Hi@Marvin,我只是编辑了这篇文章让它更清晰