2015-07-13 2 views
0

До сих пор у меня есть этот проект, в котором я читал в файле свойств, используя PropertiesConfiguration (из Apache), редактируя значения, которые я хотел бы редактировать, а затем сохраняю изменения в файле. Он сохраняет комментарии и форматирование и такие, но одна вещь, которую он делает изменение принимает значения в многоканальный отформатированные так:Свойства Файл многострочные значения с помощью PropertiesConfiguration

key=value1,\ 
    value2,\ 
    value3 

и превращает его в стиле массива:

key=value1,value2,value3 

Я бы чтобы иметь возможность печатать те строки, отформатированные как раньше.
Я сделал это с помощью этого метода:

PropertiesConfiguration config = new PropertiesConfiguration(configFile); 
config.setProperty(key,value); 
config.save(); 
+0

Это невозможно при реализации текущей версии apache-commons-config – 6ton

ответ

0

Я создал работу вокруг в случае, если кто-то нуждается в этой функции. Кроме того, вероятно, есть лучший способ сделать это, но это решение в настоящее время работает для меня.

Во-первых, установить PropertiesConfiguration разделитель на символ новой строки так:

PropertiesConfiguration config = new PropertiesConfiguration(configFile); 
config.setListDelimiter('\n'); 

Затем вам нужно будет перебрать и обновить все свойства (установить формат):

Iterator<String> keys = config.getKeys(); 
    while (keys.hasNext()) { 
     String key = keys.next(); 

     config.setProperty(key,setPropertyFormatter(key, config.getProperty(key))) ; 

    } 

используйте этот метод для форматирования данных списка значений (как показано выше):

private List<String> setPropertyFormatter(String key, Object list) { 
    List<String> tempProperties = new ArrayList<>(); 
    Iterator<?> propertyIterator = PropertyConverter.toIterator(list, '\n');; 
    String indent = new String(new char[key.length() + 1]).replace('\0', ' '); 

    Boolean firstIteration = true; 
    while (propertyIterator.hasNext()) { 
     String value = propertyIterator.next().toString(); 

     Boolean lastIteration = !propertyIterator.hasNext(); 

     if(firstIteration && lastIteration) { 
      tempProperties.add(value); 
      continue; 
     } 

     if(firstIteration) { 
      tempProperties.add(value + ",\\"); 
      firstIteration = false; 
      continue; 
     } 

     if (lastIteration) { 
      tempProperties.add(indent + value); 
      continue; 
     } 

     tempProperties.add(indent + value + ",\\"); 
    } 



    return tempProperties; 
} 

Затем i t будет почти правильным, за исключением того, что функция сохранения принимает двойную обратную косую черту, которая хранится в списке, и превращает ее в 4 обратных косая черта в файле! Поэтому вам нужно заменить их одним обратным слэшем. Я сделал это так:

try { 
     config.save(new File(filePath)); 


     byte[] readIn = Files.readAllBytes(Paths.get(filePath)); 
     String replacer = new String(readIn, StandardCharsets.UTF_8).replace("\\\\\\\\", "\\"); 

     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath, false), "UTF-8")); 
     bw.write(replacer); 
     bw.close(); 

} catch (ConfigurationException | IOException e) { 
     e.printStackTrace(); 
} 
Смежные вопросы