Лучший способ представить массив в файле свойств Java - PullRequest
47 голосов
/ 10 августа 2011

В настоящее время я делаю файл .properties, который необходимо загрузить и преобразовать в массив.Но существует возможность существования от 0 до 25 каждого из ключей свойства.Я попробовал несколько реализаций, но я просто застрял на этом чисто.У кого-нибудь есть идеи?

foo.1.filename=foo.txt
foo.1.expire=200

foo.2.filename=foo2.txt
foo.2.expire=10

etc more foo's

bar.1.filename=bar.txt
bar.1.expire=100

, где я соберу пары имя файла / срок действия в объект данных, как часть массива для каждого родительского элемента свойства, например foo[myobject]

Форматированиефайла свойств может измениться, я открыт для идей.

Ответы [ 8 ]

35 голосов
/ 04 июля 2012

Я могу предложить использовать разделители и

String.split(delimiter)

Пример файла свойств:

MON = 0800 # Something # Something1, Something2

prop.load(new FileInputStream("\\\\Myseccretnetwork\\Project\\props.properties"));
String[]values = prop.get("MON").toString().split("#");

Надеюсь, это поможет

12 голосов
/ 10 августа 2011

Либо определите разделитель, который не будет потенциальным значением, либо научитесь использовать XML.

Если вы все еще настаиваете на использовании свойств, используйте один из методов, которые будут возвращать список всех ключей.Ваш ключ состоит из трех частей: идентификатора группы (foo, bar), индекса (1, 2), а затем имени элемента (имя файла, срок действия).Получить все ключи разбить их на составные части.Создайте список для каждого типа идентификатора, при обработке списка используйте идентификатор, чтобы определить, к какому списку добавить.Создайте свои парные элементы, как вы сказали, и просто добавьте в список!Если порядок индексов важен, либо добавьте это как поле к вашим парным элементам, либо отсортируйте ключи перед обработкой.

12 голосов
/ 10 августа 2011

Не совсем понял ваше намерение.Проверьте библиотеку конфигурации Apache Commons http://commons.apache.org/configuration/

Вы можете иметь несколько значений для ключа, как в ключе = значение1, значение2, и вы можете прочитать это в массив как configuration.getAsStringArray("key")

4 голосов
/ 10 августа 2011

Я настоятельно рекомендую использовать Apache Commons (http://commons.apache.org/configuration/).. Он имеет возможность использовать XML-файл в качестве файла конфигурации. Использование XML-структуры упрощает представление массивов в виде списков значений, а не специально пронумерованных свойств.

3 голосов
/ 16 февраля 2018

Используйте YAML файлы для свойств, это поддерживает свойства как массив.

Быстрый взгляд о YAML:

Надстройка JSON, она может делать все, что может JSON + еще

  1. Простой для чтения
  2. Длинные свойства в многострочные значения
  3. Поддерживает комментарии
  4. Свойства как массив
  5. Валидация YAML
3 голосов
/ 21 июля 2016

У меня есть пользовательская загрузка.Свойства должны быть определены как:

key.0=value0
key.1=value1
...

Выборочная загрузка:

/** Return array from properties file. Array must be defined as "key.0=value0", "key.1=value1", ... */
public List<String> getSystemStringProperties(String key) {

    // result list
    List<String> result = new LinkedList<>();

    // defining variable for assignment in loop condition part
    String value;

    // next value loading defined in condition part
    for(int i = 0; (value = YOUR_PROPERTY_OBJECT.getProperty(key + "." + i)) != null; i++) {
        result.add(value);
    }

    // return
    return result;
}
1 голос
/ 04 июля 2014

вот еще один способ сделать это, внедрив сам механизм. здесь мы считаем, что массив должен начинаться с 0 и не иметь дыры между индексами

    /**
     * get a string property's value
     * @param propKey property key
     * @param defaultValue default value if the property is not found
     * @return value
     */
    public static String getSystemStringProperty(String propKey,
            String defaultValue) {
        String strProp = System.getProperty(propKey);
        if (strProp == null) {
            strProp = defaultValue;
        }
        return strProp;
    }

    /**
     * internal recursive method to get string properties (array)
     * @param curResult current result
     * @param paramName property key prefix
     * @param i current indice
     * @return array of property's values
     */
    private static List<String> getSystemStringProperties(List<String> curResult, String paramName, int i) {
        String paramIValue = getSystemStringProperty(paramName + "." + String.valueOf(i), null);
        if (paramIValue == null) {
            return curResult;
        }
        curResult.add(paramIValue);
        return getSystemStringProperties(curResult, paramName, i+1);
    }

    /**
     * get the values from a property key prefix
     * @param paramName property key prefix
     * @return string array of values
     */
    public static String[] getSystemStringProperties(
            String paramName) {
        List<String> stringProperties = getSystemStringProperties(new ArrayList<String>(), paramName, 0);
        return stringProperties.toArray(new String[stringProperties.size()]);
    }

Вот способ проверить:

    @Test
    public void should_be_able_to_get_array_of_properties() {
        System.setProperty("my.parameter.0", "ooO");
        System.setProperty("my.parameter.1", "oO");
        System.setProperty("my.parameter.2", "boo");
        // WHEN 
        String[] pluginParams = PropertiesHelper.getSystemStringProperties("my.parameter");

        // THEN
        assertThat(pluginParams).isNotNull();
        assertThat(pluginParams).containsExactly("ooO","oO","boo");
        System.out.println(pluginParams[0].toString());
    }

надеюсь, это поможет

и все замечания приветствуются ..

0 голосов
/ 10 августа 2011

Как уже указал пользователь Skip Head, CSV или любой другой формат файла таблицы будет более подходящим в вашем случае.

Если это вариант для вас, возможно, это Таблица реализация может вас заинтересовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...