Объединить свойства в ResourceBundle из System.getProperties()

Я создаю ResourceBundle из файла, этот пакет содержит значения ‹ String, String>.

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

Я хотел бы добавить/заменить в этом пакете некоторые свойства, которые я передаю из командной строки, используя -Dsome.option.val.NAME1=HiEarth

Меня не волнует сбрасывание старого пакета и создание нового вместо него.

Не могли бы вы дать чаевые?

Я думаю, что мне нужно сделать следующее:

  1. Создайте из пакета HashMap‹ String, String>
  2. Заменить значения.
  3. Преобразуйте HashMap в InputStream. // Это сложная часть...
  4. Создайте новый пакет из этого.

person Maxim Veksler    schedule 16.02.2009    source источник


Ответы (2)


Это делает часть того, что вы хотите (преобразует 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();
    }
person TofuBeer    schedule 16.02.2009
comment
+1. Однако я хотел бы добавить предостережение. Properties.list() обрезает значения › 40 символов (см. отчет об ошибке: bugs.sun.com/bugdatabase/). Вместо этого рассмотрите возможность использования Properties.store(). - person Manoj Govindan; 29.01.2012

Это может быть не лучший способ сделать это, но это лучшее, что я могу придумать: реализовать подкласс 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
    }
}
person David Z    schedule 16.02.2009