Лучший способ представления массива в файле свойств 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]
Форматирование файла свойств может измениться, я открыт для идей.
Ответы
Ответ 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());
}
надеюсь, что это поможет
и все замечания приветствуются.