Изменение значения в файле свойств во время выполнения

Я хочу изменить значение свойства в файле свойств. Я пробовал несколько способов, таких как FileInputStream/FileOutputStream или библиотека Apache, но все они изменяют структуру файла.

Структура моего файла:

#[Section 1]
prop1=value1
prop2=value2

#[Section 2]
prop2=value2
prop4=value4

После выполнения кода свойство изменяется, но элементы "раздела" исчезают, а файл состоит только из списка неупорядоченных свойств.
Есть ли способ сохранить структуру выше?

Я попробовал эти пути: Обновление значения свойства в файле свойств без удаления других значений.

4 ответа

Решение

Общий подход для изменения любого файла состоит в том, чтобы прочитать содержимое файла, сохранить содержимое файла в памяти, изменить требуемое содержимое и записать обратно весь контент. Если вы пишете значения свойств напрямую, маркировка разделов исчезнет. В приведенном выше случае, конечно, есть одно исключение, если вы добавляете контент в конец файла. В любом другом месте вы должны прочитать файл и записать файл целиком.

Я использовал Apache Commons-Configuration, и он работал нормально:

PropertiesConfiguration conf = new PropertiesConfiguration("p.properties");
conf.setProperty("prop3", "newValue");
conf.save();

Вся структура не меняется.

Да, весь файл переписан. Также свойства разделяются (вы можете их кэшировать), а файлы свойств обычно являются файлами ресурсов в пути к классам, поэтому могут быть упакованы в jar/war.

Тем не менее, кажется, что он у вас доступен для записи, и все, вы можете выбрать файл свойств XML. См. API свойств с loadFromXML и storeToXML. Это также поддерживает UTF-8.

Например, вот так:

try(InputStream is = getClass().getResourceAsStream("my.properties")) {
    Properties properties = new Properties();
    properties.load(is);
    properties.setProperty("prop4", "CHANGED");
    props.store(out);
}    

Обратите внимание, что запись в файлы свойств не является обычной практикой. Обычно вы предоставляете файл по умолчанию в своем дистрибутиве, и пользователь может изменять значения для настройки системы. Если вам нужно сохранить данные приложения, рассмотрите возможность использования API настроек Java.

Другие вопросы по тегам