我正在编写一个包含许多可用设置的java应用程序。基本上我的配置结构如下所示:
配置
| _游戏1
| _游戏名称:等等......
| _玩家姓名:爱丽丝
| _玩家姓名:鲍勃
| _其他设置......
| _游戏2
| _游戏名称:哈
| _玩家姓名:爱丽丝
| _玩家姓名:鲍勃
| _其他设置......
| _游戏n ....
你明白了。我尝试使用xml但是使用dom4j是一种痛苦,特别是在不同和相同的父节点中有很多具有相同名称的子节点,我需要对它们进行大量更改。到目前为止,我发现的最简单的方法是使用纯文本文件
[游戏1]
游戏名称:等等
球员姓名:爱丽丝
球员姓名:鲍勃
...
[游戏2]
...
但我觉得这是非常简陋的。那么在java中维护配置文件的行业最佳或标准做法是什么?
编辑 :我希望解决方案是可移植的,比如将文件从一台计算机复制到另一台计算机不会破坏程序。 (抱歉忘记提前了。)
在java中存储设置/首选项的最佳方法是使用 首选项API。
您应该使用自动编组器来编写XML文件。几年前,我用过 CastorXML 但是今天,可能有更多现代API用于此目的。
使用此API,您基本上:
- 将所有配置存储在一个简单的POJO中
- 实例化Marshaller
- 调用marshaller.write(MyConfig)
如果要加载配置:
- 实例化Unmarshaller
- 致电Marshaller.read(yourFile)
您可以在配置文件中描述XML映射或使用默认的Marshaller(1属性~1 XML标记)
就这么简单。
编辑:
搜索后 这个帖子,JAXB规范是在第一次发布CastorXML之后发布的,而JAXB的Sun实现现在似乎是 Java <-> XML
映射。
在java中存储设置/首选项的最佳方法是使用 首选项API。
您应该使用自动编组器来编写XML文件。几年前,我用过 CastorXML 但是今天,可能有更多现代API用于此目的。
使用此API,您基本上:
- 将所有配置存储在一个简单的POJO中
- 实例化Marshaller
- 调用marshaller.write(MyConfig)
如果要加载配置:
- 实例化Unmarshaller
- 致电Marshaller.read(yourFile)
您可以在配置文件中描述XML映射或使用默认的Marshaller(1属性~1 XML标记)
就这么简单。
编辑:
搜索后 这个帖子,JAXB规范是在第一次发布CastorXML之后发布的,而JAXB的Sun实现现在似乎是 Java <-> XML
映射。
考虑使用 YAML 为了定义您的配置,与XML相比,它更加冗长,例如:
games:
- name: 'game 1'
players: ['Bob', 'Alice']
...
- name: 'game 2'
players: ['Bob', 'Alice']
...
然后你可以使用 杰克逊 图书馆 YAML扩展 与配置交互,例如解析配置:
File configFile = new File("...");
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Configuration config = mapper.readValue(configFile, Configuration.class);
查看 Apache Commons配置。
它提供了良好的支持 分层配置。
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]");