Java ResourceBundle.getBundle 如何加载属性文件?
How does Java ResourceBundle.getBundle load properties file?
我花了一些时间尝试加载属性文件,但找不到任何有效的解决方案。这是我的设置图片。
属性文件位置:/sandbox/resources/properties/MessageBundle_en_US.properties
应用程序位置:/sandbox/src/main/java/com/app/sandbox/App.java
不确定发生了什么。我尝试了几种组合,但就是无法通过异常。我什至尝试了文件夹的整个路径。谁能告诉我 ResourceBundle.getBundle() 方法如何查找属性文件?
更新 1: 此解决方案在几分钟后停止工作:
ResourceBundle mybundle = ResourceBundle.getBundle("MessageBundle");
更新 2: 以上解决方案在我上次 运行 期间不再有效。所以我改成了:
ResourceBundle mybundle = ResourceBundle.getBundle("properties/MessageBundle");
它奏效了。 ResourceBundle 查找属性文件的方式似乎存在缓存问题。
我仍然不确定 ResourceBundle class 如何查找属性文件。它说要传递一个 "baseName" 参数:
baseName - the base name of the resource bundle, a fully qualified class name
https://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html#getBundle(java.lang.String)
但尚不清楚它是如何开始寻找文件的。它是否从项目目录的根目录开始查找?如果有人能回答这个问题,那就太好了。 完全限定的 class 名称 是什么意思?我不认为 "properties.MessageBundle" 是完全合格的。
尝试如下使用;
ResourceBundle bundle = ResourceBundle.getBundle("properties/MessageBundle");
是的,应该是这样
ResourceBundle mybundle = ResourceBundle.getBundle("MessageBundle");
它能找到它的原因,在属性包中而不指定整个路径,是因为 Java 知道默认情况下包应该在那个包中,而且它不需要其他部分。
因此,如果您使用整个路径,如:"/sandbox/resources/properties/MessageBundle"
,Java 将其解释为:
"/sandbox/resources/properties/MessageBundle/sandbox/resources/properties/MessageBundle"
这显然是不正确的。因此,如果您需要在属性包中创建更多包,只需从那里开始,而不是从项目的根目录开始。
我花了一些时间尝试加载属性文件,但找不到任何有效的解决方案。这是我的设置图片。
属性文件位置:/sandbox/resources/properties/MessageBundle_en_US.properties
应用程序位置:/sandbox/src/main/java/com/app/sandbox/App.java
不确定发生了什么。我尝试了几种组合,但就是无法通过异常。我什至尝试了文件夹的整个路径。谁能告诉我 ResourceBundle.getBundle() 方法如何查找属性文件?
更新 1: 此解决方案在几分钟后停止工作:
ResourceBundle mybundle = ResourceBundle.getBundle("MessageBundle");
更新 2: 以上解决方案在我上次 运行 期间不再有效。所以我改成了:
ResourceBundle mybundle = ResourceBundle.getBundle("properties/MessageBundle");
它奏效了。 ResourceBundle 查找属性文件的方式似乎存在缓存问题。
我仍然不确定 ResourceBundle class 如何查找属性文件。它说要传递一个 "baseName" 参数:
baseName - the base name of the resource bundle, a fully qualified class name
https://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html#getBundle(java.lang.String)
但尚不清楚它是如何开始寻找文件的。它是否从项目目录的根目录开始查找?如果有人能回答这个问题,那就太好了。 完全限定的 class 名称 是什么意思?我不认为 "properties.MessageBundle" 是完全合格的。
尝试如下使用;
ResourceBundle bundle = ResourceBundle.getBundle("properties/MessageBundle");
是的,应该是这样
ResourceBundle mybundle = ResourceBundle.getBundle("MessageBundle");
它能找到它的原因,在属性包中而不指定整个路径,是因为 Java 知道默认情况下包应该在那个包中,而且它不需要其他部分。
因此,如果您使用整个路径,如:"/sandbox/resources/properties/MessageBundle"
,Java 将其解释为:
"/sandbox/resources/properties/MessageBundle/sandbox/resources/properties/MessageBundle"
这显然是不正确的。因此,如果您需要在属性包中创建更多包,只需从那里开始,而不是从项目的根目录开始。