问题 维护java应用程序配置文件的最佳方法[关闭]


我正在编写一个包含许多可用设置的java应用程序。基本上我的配置结构如下所示:

配置
| _游戏1
   | _游戏名称:等等......
   | _玩家姓名:爱丽丝
   | _玩家姓名:鲍勃
   | _其他设置......
| _游戏2
   | _游戏名称:哈
   | _玩家姓名:爱丽丝
   | _玩家姓名:鲍勃
   | _其他设置......
| _游戏n ....

你明白了。我尝试使用xml但是使用dom4j是一种痛苦,特别是在不同和相同的父节点中有很多具有相同名称的子节点,我需要对它们进行大量更改。到目前为止,我发现的最简单的方法是使用纯文本文件

[游戏1]
游戏名称:等等
球员姓名:爱丽丝
球员姓名:鲍勃
...

[游戏2]
...

但我觉得这是非常简陋的。那么在java中维护配置文件的行业最佳或标准做法是什么?

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


11025
2017-07-11 12:04


起源



答案:


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


5
2017-07-11 12:12





您应该使用自动编组器来编写XML文件。几年前,我用过 CastorXML 但是今天,可能有更多现代API用于此目的。

使用此API,您基本上:

  • 将所有配置存储在一个简单的POJO中
  • 实例化Marshaller
  • 调用marshaller.write(MyConfig)

如果要加载配置:

  • 实例化Unmarshaller
  • 致电Marshaller.read(yourFile)

您可以在配置文件中描述XML映射或使用默认的Marshaller(1属性~1 XML标记)

就这么简单。

编辑:

搜索后 这个帖子,JAXB规范是在第一次发布CastorXML之后发布的,而JAXB的Sun实现现在似乎是 Java <-> XML 映射。


2
2017-07-11 12:08



这里的交易破坏者是我有很多具有相同名称的属性,比如 player name。所以,当我想改变 Alice 至 Leo,我想确保它不会覆盖 Bob 这里。 CastorXML可以保证吗?谢谢。 - YankeeWhiskey


答案:


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


5
2017-07-11 12:12





您应该使用自动编组器来编写XML文件。几年前,我用过 CastorXML 但是今天,可能有更多现代API用于此目的。

使用此API,您基本上:

  • 将所有配置存储在一个简单的POJO中
  • 实例化Marshaller
  • 调用marshaller.write(MyConfig)

如果要加载配置:

  • 实例化Unmarshaller
  • 致电Marshaller.read(yourFile)

您可以在配置文件中描述XML映射或使用默认的Marshaller(1属性~1 XML标记)

就这么简单。

编辑:

搜索后 这个帖子,JAXB规范是在第一次发布CastorXML之后发布的,而JAXB的Sun实现现在似乎是 Java <-> XML 映射。


2
2017-07-11 12:08



这里的交易破坏者是我有很多具有相同名称的属性,比如 player name。所以,当我想改变 Alice 至 Leo,我想确保它不会覆盖 Bob 这里。 CastorXML可以保证吗?谢谢。 - YankeeWhiskey


考虑使用 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);

1
2017-07-11 13:22





查看 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]");

1
2017-07-11 12:23