6

这是一个简单的问题,我找不到结论性的答案。

我可以从文件中加载字符串属性(例如:对准备好的语句的查询)config.properties。假设我想连接要连接的数据库连接。

如果我想从文件中获取这些信息,我可以在课堂上执行以下操作:

    private static final ResourceBundle BUNDLE = ResourceBundle.getBundle("scheduler");
    private static final String DRIVER  = BUNDLE.getString("bd.driver");
    private static final String CONNECTIONURL  =BUNDLE.getString("bd.url");
....

但相反,我看到很多人建议使用属性,然后我必须对这样的事情做同样的事情(如果我想保持类静态并且没有适当的构造函数):

static {
        prop = new Properties(); 
        try {                prop.load(ReportsDB.class.getClassLoader().getResourceAsStream("config.properties"));
        } catch (IOException ex) {
            Logger.getLogger(ReportsDB.class.getName()).log(Level.SEVERE, null, ex);
            throw new RuntimeException(ex);
        }
    }

    private static final String DRIVER  = prop.getProperty("bd.driver");
    private static final String CONNECTIONURL  = prop.getProperty("bd.url");

那么,为什么我不应该使用 theResourceBundle而不是Properties当第二个更冗长时呢?

4

2 回答 2

9

那么,当第二个更冗长时,为什么我不应该使用 ResourceBundle 而不是 Properties 呢?

因为那不是ResourceBundle目的。类的描述开始于:

资源包包含特定于语言环境的对象。当您的程序需要特定于语言环境的资源(例如字符串)时,您的程序可以从适合当前用户语言环境的资源包中加载它。通过这种方式,您可以编写在很大程度上独立于用户语言环境的程序代码,从而将资源包中的大多数(如果不是全部)特定于语言环境的信息隔离开来。

这听起来像你的用例吗?我不这么认为。

听起来问题纯粹是加载属性文件的冗长:所以编写一个实用程序方法来做到这一点。那么你的代码可以很简单:

private static final Properties CONFIGURATION = PropertyUtil.load("scheduler.properties");
private static final String DRIVER = CONFIGURATION.getString("bd.driver");
private static final String CONNECTIONURL = CONFIGURATION.getString("bd.url");

诚然,我并不热衷于像这样以依赖于顺序的方式使用静态字段初始值设定项......我很想将所有配置封装在一个单独的类中,因此您可以编写:

private static final SchedulerConfiguration CONFIG = 
    SchedulerConfiguration.load("scheduler.properties");

然后使用CONFIG.getDriver()每次都可以从属性中获取的等,或者使用一个字段,或者其他什么。

于 2013-02-14T20:14:40.693 回答
0

一个具体的区别是ResourceBundle.getBundle("scheduler")它将在类路径(例如 src 包文件夹)中搜索文件。如果您调用ResourceBundle.getBundle("myfile")外部文件,您将获得MissingResourceException.

如果要使用外部文件(例如位于项目根目录中的文件),可以使用 Properties 类:

Properties configuration = new Properties();
try (InputStream input = new FileInputStream("configuration.properties")) {
        configuration.load(input);
        System.out.println("Configuration value: " + configuration.getProperty("key"));
    } catch (IOException e) {
        e.printStackTrace();
    }
于 2017-11-23T08:53:06.150 回答