Ответ 1
Лучший способ сохранить настройки/предпочтения в java - использовать API настроек.
Я пишу Java-приложение, содержащее множество полезных настроек. В основном моя структура конфигурации выглядит следующим образом:
Config |_ game 1 |_ Game name: blah... |_ Player name: alice |_ Player name: bob |_ other settings... |_ game 2 |_ Game name: hah |_ Player name: alice |_ Player name: bob |_ other settings... |_ game n....
У тебя есть идея. Я пробовал использовать xml, но работа с dom4j - это боль, особенно много дочерних узлов с одним и тем же именем в разных и одинаковых родительских узлах, и мне нужно их много менять. До сих пор самый простой способ, который я обнаружил, - использовать обычный текстовый файл, например
[Game 1] Game name: blah Player name: alice Player name: bob ... [Game 2] ...
Но я чувствую, что это очень рудиментарно. Итак, что является лучшей или стандартной практикой в отрасли для поддержки конфигурационных файлов в java?
EDIT. Я бы хотел, чтобы решение было переносимым, например, копирование файла с одного компьютера на другой не нарушит работу программы. (Извините, не забывайте об этом.)
Лучший способ сохранить настройки/предпочтения в java - использовать API настроек.
Вы должны были использовать автоматический маршаллер для записи вашего XML файла. Несколько лет назад я использовал CastorXML, но сегодня для этого есть, вероятно, более современные API.
С помощью этого API вы в основном:
Если вы хотите загрузить конфигурацию:
Вы можете описать сопоставление XML в файле конфигурации или использовать по умолчанию Marshaller (1 атрибут ~ 1 XML-тег)
Это так просто.
EDIT:
После поиска в этой теме спецификация JAXB появилась после первой версии CastorXML, а реализация Sun JAXB теперь является стандартом для отображения Java <-> XML
.
Проверьте Конфигурация сообщества Apache.
Он обеспечивает хорошую поддержку иерархических конфигураций .
XMLConfiguration config = new XMLConfiguration("games.xml");
String gameName = config.getString("game1.name");
List<Object> playerNames = config.getList("game1.players.player.name");
// ...
config.setProperty("game1.name", "Space Invaders"); // update game name
config.addProperty("game1.players.player(-1).name", "ted"); // add new players
config.addProperty("game1.players.player(-1).name", "carol");
config.clearTree("game1.players.player(1)"); // remove a player
// Or with XPath
config.setExpressionEngine(new XPathExpressionEngine());
config.addProperty("game1/players player/name", "ted");
config.addProperty("game1/players player/name", "carol");
config.clearTree("game1/players/player[2]");
Рассмотрите возможность использования YAML для определения вашей конфигурации, это гораздо менее подробный по сравнению с XML, например:
games:
- name: 'game 1'
players: ['Bob', 'Alice']
...
- name: 'game 2'
players: ['Bob', 'Alice']
...
Затем вы можете использовать библиотеку Jackson с расширением YAML для взаимодействия с конфигурацией, например, для анализа конфигурации:
File configFile = new File("...");
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Configuration config = mapper.readValue(configFile, Configuration.class);