维护java应用程序配置文件的最佳方法

维护java应用程序配置文件的最佳方法,java,config,Java,Config,我正在编写一个包含大量可保存设置的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 set

我正在编写一个包含大量可保存设置的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.... 配置 |_游戏1 |_游戏名称:废话。。。 |_玩家名称:爱丽丝 |_球员姓名:鲍勃 |_其他设置。。。 |_游戏2 |_游戏名称:哈 |_玩家名称:爱丽丝 |_球员姓名:鲍勃 |_其他设置。。。 |_游戏。。。。 你有主意了。我尝试使用xml,但使用dom4j是一件痛苦的事情,尤其是在不同和相同的父节点中有许多同名的子节点,我需要对它们进行很多更改。到目前为止,我发现最简单的方法是使用纯文本文件,如

[Game 1] Game name: blah Player name: alice Player name: bob ... [Game 2] ... [游戏1] 游戏名称:布拉 玩家名称:爱丽丝 球员姓名:鲍勃 ... [游戏2] ... 但我觉得这是非常初级的。那么,在java中维护配置文件的最佳或标准实践是什么呢


编辑:我希望解决方案是可移植的,就像将文件从一台计算机复制到另一台计算机不会破坏程序一样。(抱歉,忘了在前面提到这一点。)

您应该使用自动封送拆收器来编写XML文件。几年前,我使用过,但今天,可能有更现代的API来实现这一目的

使用此API,您基本上可以:

  • 将所有配置存储在一个简单的POJO中
  • 实例化封送员
  • 调用marshaller.write(MyConfig)
当您要加载配置时:

  • 实例化解组器
  • 调用Marshaller.read(您的文件)
您可以在配置文件中描述XML映射,也可以使用默认的封送拆收器(1属性~1 XML标记)

就这么简单

编辑:


在搜索之后,JAXB规范出现在CastorXML第一次实现之后,JAXB的Sun实现现在似乎成为
JavaXML
映射的标准。

在Java中存储设置/首选项的最佳方法是使用。

签出

它提供了良好的支持

XMLConfiguration config=newxmlconfiguration(“games.xml”);
String gameName=config.getString(“game1.name”);
List playerNames=config.getList(“game1.players.player.name”);
// ...
config.setProperty(“game1.name”,“太空入侵者”);//更新游戏名称
config.addProperty(“game1.players.player(-1.name”,“ted”);//添加新玩家
config.addProperty(“game1.players.player(-1.name)、“carol”);
config.clearTree(“game1.players.player(1)”;//除名
//或者使用XPath
config.setExpressionEngine(新的XPathExpressionEngine());
config.addProperty(“game1/players/name”、“ted”);
config.addProperty(“game1/players/name”、“carol”);
config.clearTree(“game1/players/player[2]”);
考虑使用来定义配置,与XML相比,它要简单得多,例如:

games:
  - name: 'game 1'
    players: ['Bob', 'Alice']
    ...
  - name: 'game 2'
    players: ['Bob', 'Alice']
    ...
然后,您可以使用具有的库与配置交互,例如解析配置:

File configFile = new File("...");
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Configuration config = mapper.readValue(configFile, Configuration.class);

这里的交易破坏者是我有很多同名属性,比如
玩家名
。因此,当我想将
Alice
更改为
Leo
时,我想确保它不会覆盖
Bob
。CastorXML能保证这一点吗?谢谢。YAML至少可以在不同的堆栈之间进行移植。这是作者的必备条件之一。
File configFile = new File("...");
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Configuration config = mapper.readValue(configFile, Configuration.class);