这是一个简单的问题,我无法找到结论性答案。
我可以从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
?
答案 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();
}