Изменение значения в файле свойств во время выполнения
Я хочу изменить значение свойства в файле свойств. Я пробовал несколько способов, таких как 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.