Java ResourceBundle.getBundle 如何加载属性文件?
Posted
技术标签:
【中文标题】Java ResourceBundle.getBundle 如何加载属性文件?【英文标题】:How does Java ResourceBundle.getBundle load properties file? 【发布时间】:2019-09-29 23:47:01 【问题描述】:我花了一些时间尝试加载属性文件,但找不到任何有效的解决方案。这是我的设置图片。
属性文件位置:/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 类如何查找属性文件。它说要传递一个“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)
但不清楚它是如何开始查找文件的。它是否从项目目录的根目录开始查找?如果有人能回答这个问题,那就太好了。 完全限定的类名是什么意思。我不认为“properties.MessageBundle”是完全合格的。
【问题讨论】:
文件是否存在于磁盘或jar中? @jspcal 它在磁盘上。我用“MessageBundle”临时修复了它,然后突然停止工作。我将其更改为“properties/MessageBundle”,它现在可以工作了。不确定,但可能存在缓存问题。 【参考方案1】:是的,应该是这样
ResourceBundle mybundle = ResourceBundle.getBundle("MessageBundle");
之所以能找到,是在properties包里没有指定整个路径,是因为Java知道bundles默认应该在那个包里,其他部分不需要。
所以,如果你使用像"/sandbox/resources/properties/MessageBundle"
这样的整个路径,Java 会像这样解释它:
"/sandbox/resources/properties/MessageBundle/sandbox/resources/properties/MessageBundle"
这显然是不正确的。因此,如果您需要在属性包中创建更多包,请从那里开始,而不是从项目的根目录开始。
【讨论】:
我更新了解决方案。 “MessageBundle”参数工作了几分钟,然后停止工作。正在查找的路径似乎存在缓存问题。【参考方案2】:尝试如下使用;
ResourceBundle bundle = ResourceBundle.getBundle("properties/MessageBundle");
【讨论】:
我更新了我的帖子。您的解决方案有效,但您知道 getBundle 如何查找属性文件吗? “MessageBundle”工作了几分钟,然后停止工作,所以我认为可能存在缓存问题。 似乎 Eclipse 工作区没有刷新。您可能已将 MessageBundle_en_US.properties 移动到属性包或目录下。在工作区刷新之前它可能会起作用。以上是关于Java ResourceBundle.getBundle 如何加载属性文件?的主要内容,如果未能解决你的问题,请参考以下文章