Подтвердить что ты не робот

Лучший способ представления массива в файле свойств 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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

String.split(delimiter)

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

MON = 0800 # Что-то # Something1, Something2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Как уже указывал пользователь "Skip Head", csv или любой формат табличного файла были бы лучше в вашем случае.

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

Ответ 7

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

    /**
     * get a string property 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 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());
    }

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

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