Лучший класс для обновления файлов свойств?
Хоть java.util.properties
позволяет читать и записывать файл свойств, запись не сохраняет форматирование. Не удивительно, потому что он не привязан к файлу свойств.
Есть ли PropertyFile
Класс там - или некоторые такие - что сохраняет комментарии и пустые строки и обновляет значения свойств на месте?
7 ответов
Это не намного лучше, чем Apache Commons Configuration API. Это обеспечивает единый подход к настройке из файлов свойств, XML, JNDI, источников данных JDBC и т. Д.
Это обработка файлов свойств, это очень хорошо. Он позволяет вам генерировать объект PropertiesConfigurationLayout из вашего свойства, который сохраняет как можно больше информации о вашем файле свойств (пробелы, комментарии и т. Д.). Когда вы сохраняете изменения в файле свойств, они будут сохранены как можно лучше.
Образец кода:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.PropertiesConfigurationLayout;
public class PropertiesReader {
public static void main(String args[]) throws ConfigurationException, FileNotFoundException {
File file = new File(args[0] + ".properties");
PropertiesConfiguration config = new PropertiesConfiguration();
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
layout.load(new InputStreamReader(new FileInputStream(file)));
config.setProperty("test", "testValue");
layout.save(new FileWriter("path\\to\\properties\\file.properties", false));
}
}
Смотрите также:
Пример кода для использования библиотеки конфигурации Apache Commons, предоставленной Патриком Боосом, излишне сложен. Вам не нужно явно использовать PropertiesConfigurationLayout, если вам не требуется расширенный контроль над выводом. PropertiesConfiguration сама по себе достаточна для сохранения комментариев и форматирования:
PropertiesConfiguration config = new PropertiesConfiguration("myprops.properties");
config.setProperty("Foo", "Bar");
config.save();
(Примечание: этот код работает для существующей стабильной версии 1.10. Я не проверял, работает ли он на альфа-сборках 2.0, доступных в настоящее время.)
Класс configuration2 имеет другой синтаксис. Вот пример их использования:
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.PropertiesConfigurationLayout;
public void test() {
PropertiesConfiguration config = new PropertiesConfiguration();
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout();
config.setLayout(layout);
layout.load(config, new FileReader("config.properties"));
config.setProperty("KEY", "VALUE");
StringWriter stringWriter = new StringWriter();
layout.save(config, stringWriter);
LOG.debug("Properties:\n{}", stringWriter.toString());
}
Вы можете взглянуть на конфигурацию Apache Commons, которая содержит класс PropertiesConfiguration. Однако, поскольку я никогда не использовал это, я не знаю, сохраняет ли это комментарии и форматирование...
Тем не менее, это попытка сорвать...
File file = new File("src/test/resources/1automation.properties");
PropertiesConfiguration config = new PropertiesConfiguration();
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
layout.load(new InputStreamReader(new FileInputStream(file)));
FileWriter fw = new FileWriter("src/test/resources/1automation.properties",false);
config.setProperty("myssi.admin.name", "testValue");
layout.save(fw);
Просто в ответ Джинсу Мартину, у которого возникли проблемы с конечными пробелами в записанных файлах свойств, например, ключ = значение вместо ключа = значение.
Вы можете вызвать layout.setGlobalSeparator("="), чтобы обойти это.
Лучший ответ содержит небольшую ошибку: строка:
PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
Должен быть заменен:
PropertiesConfigurationLayout layout = config.getLayout();
Однажды я видел класс, чтобы сделать это с INI-файлами, но больше не могу найти ссылку. Если вы не можете найти что-то еще, вы можете попробовать DecentXML. Я написал этот синтаксический анализатор XML с конкретной целью разработки, чтобы сохранить исходное форматирование на 100% (то есть с комментариями, странными пробелами в элементах или вокруг корневого элемента, всего).
Во время анализа получающегося XML-документа вам просто нужно запомнить элементы, которые содержат значение для ваших опций, и заменить в них текстовый узел. Когда вы сохраняете, ничего нетронутого не изменится в любом случае.