it-swarm.com.ru

Лучший способ представить массив в файле свойств Java

В настоящее время я делаю файл .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]

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

45
yep

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

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

11
BigMac66

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

String.split(delimiter)

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

MON = 0800 # Something # Something1, Something2

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

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

34
Abs

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

Вы можете иметь несколько значений для ключа, как в Key = value1, value2 , И вы можете считать это в массив как configuration.getAsStringArray("key")

11
Venu K

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

4
Jack Cox

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

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;
}
3
somtomas

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

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

Расширенный набор JSON, он может делать все, что может JSON + еще

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

вот еще один способ сделать это, реализовав сам механизм . здесь мы считаем, что массив должен начинаться с 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());
    }

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

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

1
boly38

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

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

0
Omnaest