为什么不使用ResourceBundle而不是Properties?

时间:2013-02-14 19:59:11

标签: java

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

我可以从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");

那么,当第二个更详细时,为什么我不应该使用ResourceBundle而不是Properties

2 个答案:

答案 0 :(得分:8)

  

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

因为那不是ResourceBundle的用途。 description of the class以:

开头
  

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

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

听起来问题是纯粹加载属性文件的详细程度:所以写一个实用工具方法来做到这一点。然后您的代码可以简单地说:

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()等,每次都可以从属性中获取,或使用字段,或其他任何内容。

答案 1 :(得分: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();
    }
相关问题