我正在编写一个包含许多可用设置的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中维护配置文件的行业最佳或标准做法是什么?
编辑:我希望解决方案具有可移植性,例如将文件从一台计算机复制到另一台计算机不会破坏程序。 (抱歉忘了提前说。)
答案 0 :(得分:5)
在java中存储设置/首选项的最佳方法是使用Preferences API。
答案 1 :(得分:2)
您应该使用自动编组程序来编写XML文件。几年前,我使用CastorXML,但今天,可能有更多现代API用于此目的。
使用此API,您基本上是:
如果要加载配置:
您可以在配置文件中描述XML映射或使用默认的Marshaller(1个属性~1个XML标记)
就这么简单。
编辑:
在this thread中搜索之后,JAXB规范在CastorXML的第一次发布之后出现,而JAXB的Sun实现现在似乎是Java <-> XML
映射的标准。
答案 2 :(得分:1)
查看Apache Commons Configuration。
它为hierarchical configurations提供了很好的支持。
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]");
答案 3 :(得分:1)
考虑使用YAML来定义您的配置,与XML相比,它更加冗长,例如:
games:
- name: 'game 1'
players: ['Bob', 'Alice']
...
- name: 'game 2'
players: ['Bob', 'Alice']
...
然后,您可以使用Jackson YAML extension库与配置进行交互,例如解析配置:
File configFile = new File("...");
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Configuration config = mapper.readValue(configFile, Configuration.class);