无法使用 ResourceBundle.getBundle() 加载 ResourceBundle 找不到基本名称的包,区域设置 en_US

Unable to load ResourceBundle with ResourceBundle.getBundle() Can't find bundle for base name , locale en_US

我在尝试加载属性文件时看到以下异常:

Caused by: java.util.MissingResourceException: Can't find bundle for base name /fontawesome/fontawesome, locale en_US

我正在使用 Maven 项目,我的属性文件位于 src\main\resources\fontawesome\fontawesome.properties

我正在使用下面的代码从 JavaFX8 main 加载这个文件 class:

FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setResources(ResourceBundle.getBundle("/fontawesome/fontawesome.properties"));

尝试绝对路径失败,将文件重命名为 fontawesome_en_US.propertiesfontawesome_en.properties(如其他 SO 帖子中所建议)也是如此。

不包含 .properties 扩展名。

ResourceBundle 尝试从当前类路径加载属性文件。

如果属性存储在子目录中,请使用“.”而不是“/”。

ResourceBundle.getBundle("fontawesome.fontawesome")

您的语言属性文件应以 _en 结尾,因此在您的情况下 fontawesome_en.properties 并且您应该使用 ResourceBundle.getBundle("fontawesome.fontawesome").

加载它

必须在 pom.xml 中包含 .properties 个文件:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.fxml</include>
            <include>**/*.css</include>
            <include>**/*.properties</include>
        </includes>
    </resource>
</resources>

这是我的经验: 如果你放一个“.”在名称中 ResourceBundle.getBundle() 将查找 class 而不是属性文件。 class 看起来像这样:

导入java.util.ListResourceBundle;

public class DataEncryptionStrings extends ListResourceBundle {
@Override
protected Object[][] getContents() {
    return new Object[][] {
        {"ErrorCreateKeystoreInstance", "an exception occurred creating the keystore instance"},
        {"ErrorLoadInitialKeystore", "an exception occurred loading the initial keystore"},
        {"ErrorLoadKeystore", "an exception occurred loading the keystore"},

它遵循命名约定:
{classname}.class 是默认值 class
{classname}_en_US.class 是美国英语 class
{classname}_fr_FR.class 法语 class

如果您没有任何“.”在名称中但有一个“/”,然后它将查找 属性 个文件。

如果你没有任何一个“。”名称中的“/”,我认为可以提供 属性 文件或 ListResourceBundle。它会找到您提供的任何内容。我不确定这种行为是否对所有 VM 都相同。

我遇到的让我有兴趣寻找解决方案的问题是我有一个带有“.”的文件名。我很确定我的问题是我实现了属性文件而不是 ListResourceBundle classes,并且文件名包含“。”在其中,ResourceBundle.getBundle(name) 寻找 ListResourceBundle classes。当我替换“。”时在带有“_”的文件名中,然后我能够找到默认的 ResourceBundle 属性文件。

User68883 似乎使用的是绝对地址“/fontawesome/fontawesome.properties”而不是相对地址“fontawesome/fontawesome.properties”。此外,在 ResourceBundle.getBundle 上,切勿在名称或区域设置中包含文件扩展名。这就是 ResouceBundle 自动为您做的事情,因为它会通过解析过程来获取您在设备区域设置的资源目录中拥有的最佳资源。