将属性合并到System.getProperties()的ResourceBundle中

时间:2009-02-16 18:33:50

标签: java properties parameters

我正在从一个文件构建一个ResourceBundle,这个包含有<字符串,字符串>值。

InputStream in = getClass().getResourceAsStream("SQL.properties");
properties = new PropertyResourceBundle(in);
in.close();

我想在此捆绑包上添加/ 替换,使用-Dsome.option.val.NAME1 = HiEarth

从命令行传递一些属性

我不关心转储旧捆绑包而是创建一个新捆绑包。

请你小费?

我认为我需要做的是:

  1. 从包中创建一个HashMap<字符串,字符串>
  2. 替换值。
  3. 将HashMap转换为InputStream。 //这是一个复杂的部分......
  4. 从中构建新捆绑包。

2 个答案:

答案 0 :(得分:1)

这可以完成您想要的一些操作(将System.properties转换为ResourceBundle)。更好的错误处理由您决定: - )

    
    public static ResourceBundle createBundle()
    {
        final ResourceBundle  bundle;
        final Properties      properties;
        final CharArrayWriter charWriter;
        final PrintWriter     printWriter;
        final CharArrayReader charReader;

        charWriter = new CharArrayWriter();
        printWriter = new PrintWriter(charWriter);

        properties = System.getProperties();
        properties.list(printWriter);

        charReader = new CharArrayReader(charWriter.toCharArray());

        try
        {
            bundle = new PropertyResourceBundle(charReader);

            return (bundle);
        }
        catch(final IOException ex)
        {
            // cannot happen
            ex.printStackTrace();
        }

        throw new Error();
    }

答案 1 :(得分:0)

这可能不是最好的方法,但这是我能想到的最好的方法:实现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
    }
}