Объединить свойства в ResourceBundle из System.getProperties () - PullRequest
2 голосов
/ 16 февраля 2009

Я строю 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 ]

1 голос
/ 16 февраля 2009

Это делает то, что вы хотите (преобразует свойства 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();
    }
0 голосов
/ 16 февраля 2009

Возможно, это не лучший способ сделать это, но это лучшее, что я могу придумать: реализовать подкласс 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...