如何从 ResourceBundle 切换到 Properties(类)?

Posted

技术标签:

【中文标题】如何从 ResourceBundle 切换到 Properties(类)?【英文标题】:How to switch from ResourceBundle to Properties (class)? 【发布时间】:2013-01-06 01:32:24 【问题描述】:

我有一个应用程序分为 2 个 Java 项目(核心和网络)。核心模块中的 Java 服务必须从位于 Web 模块中的 .properties 文件中读取值。 当我使用 ResourceBundle 时,它​​按预期工作。

我想切换到 Properties 类有几个原因(特别是因为 ResourceBundle 被缓存了,我不想实现 ResourceBundle.Control 没有缓存)。 不幸的是,我无法让它工作,特别是因为我找不到要使用的正确相对路径。

我阅读了反编译的 ResourceBundle 类(等),并注意到在某些 ClassLoader 上使用了 getResource()。 因此,我没有直接使用 FileInputStream,而是在 ServiceImpl.class 或 ResourceBundle.class 上使用 getResource() 或简单地 getResourceAsStream() 进行测试,但仍然没有成功...

有人知道如何完成这项工作吗?谢谢!

这是我的应用核心,服务获取属性值:

app-core
    src/main/java
        com.my.company.impl.ServiceImpl

            public void someRun() 
                String myProperty = null;
                myProperty = getPropertyRB("foo.bar.key"); // I get what I want
                myProperty = getPropertyP("foo.bar.key"); // not here...
            

            private String getPropertyRB(String key) 
                ResourceBundle bundle = ResourceBundle.getBundle("properties/app-info");
                String property = null;
                try 
                    property = bundle.getString(key);
                 catch (MissingResourceException mre) 
                    // ...
                
                return property;
            

            private String getPropertyP(String key) 
                Properties properties = new Properties();

                InputStream inputStream = new FileInputStream("properties/app-info.properties"); // Seems like the path isn't the good one
                properties.load(inputStream);
                // ... didn't include all the try/catch stuff

                return properties.getProperty(key);
            

这是属性文件所在的 Web 模块:

app-web
    src/main/resources
        /properties
            app-info.properties

【问题讨论】:

相关:***.com/questions/2308188/… 【参考方案1】:

您应该使用 getResource()getResourceAsStream() 以及正确的路径和类加载器。

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("properties/app-info.properties");

确保文件名为app-info.properties,而不是app-info_en.properties 之类的名称,ResourceBundle(当上下文匹配时)而不是getResourceAsStream() 可以找到。

【讨论】:

遗憾的是,如果您使用的是模块系统,这只会在当前模块中查找捆绑包。【参考方案2】:

您不应该尝试从文件系统中读取属性。更改获取属性的方法以从资源流中加载它们。伪代码:

private String getPropertyP(final String key) 
    final Properties properties = new Properties();

    final InputStream inputStream = Thread.currentThread().getContextClassLoader()
       .getResourceAsStream("properties/app-info.properties");
    properties.load(inputStream);

    return properties.getProperty(key);

【讨论】:

这个解决方案也有效(经过测试),但我更喜欢另一个对我来说更整洁且没有线程的东西。

以上是关于如何从 ResourceBundle 切换到 Properties(类)?的主要内容,如果未能解决你的问题,请参考以下文章

ResourceBundle 同时从 2 个 Properties 文件中读取

无论当前的默认Locale如何,如何获取默认的ResourceBundle

JavaWeb-国际化之ResourceBundle

如何在属性文件中指定值,以便可以使用 ResourceBundle#getStringArray 检索它们?

如何在属性文件中指定值,以便可以使用 ResourceBundle#getStringArray 检索它们?

通过 ResourceBundle 访问属性文件时出错