【问题标题】:Merge properties into a ResourceBundle from System.getProperties()从 System.getProperties() 将属性合并到 ResourceBundle
【发布时间】:2009-02-16 18:33:49
【问题描述】:
我正在从一个文件构建一个 ResourceBundle,这个包包含 值。
InputStream in = getClass().getResourceAsStream("SQL.properties");
properties = new PropertyResourceBundle(in);
in.close();
我想在这个捆绑包上添加/替换一些我使用 -Dsome.option.val.NAME1=HiEarth 从命令行传递的属性
我不在乎转储旧包并创建一个新包。
请给小费好吗?
我认为我需要做的是:
- 从包中创建一个 HashMap
- 替换值。
- 将 HashMap 转换为 InputStream。 //这是复杂的部分...
- 据此构建新的捆绑包。
【问题讨论】:
标签:
java
properties
parameters
【解决方案1】:
这可以做一些你想做的事情(将 System.properties 转换为 ResourceBundle)。更好的错误处理由您决定:-)
公共静态资源包 createBundle()
{
最终的 ResourceBundle 捆绑包;
最终属性属性;
最后的 CharArrayWriter charWriter;
最终的 PrintWriter printWriter;
最后的 CharArrayReader charReader;
charWriter = new CharArrayWriter();
printWriter = new PrintWriter(charWriter);
属性 = System.getProperties();
properties.list(printWriter);
charReader = new CharArrayReader(charWriter.toCharArray());
尝试
{
bundle = new PropertyResourceBundle(charReader);
返回(捆绑);
}
捕获(最终 IOException 前)
{
// 不可能发生
ex.printStackTrace();
}
抛出新的错误();
}
【解决方案2】:
这可能不是最好的方法,但它是我能想到的最好的方法:实现一个 ResourceBundle 的子类来存储您要添加/替换的属性,然后将该捆绑包的父类设置为PropertyResourceBundle 你从输入流中加载。
InputStream in = getClass().getResourceAsStream("SQL.properties");
properties = new PropertyResourceBundle(in);
in.close();
MyCLIResourceBundle b = new MyCLIResourceBundle(properties);
// use b as your bundle
实现类似于
public class MyCLIResourceBundle extends ResourceBundle {
public MyCLIResourceBundle(ResourceBundle parent) {
super();
this.setParent(parent);
// go on and load your chosen properties from System.getProperties() or wherever
}
}