2013-07-11 24 views
11

我在寫一個包含大量可保存設置的java應用程序。基本上我的配置結構如下所示:爲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中維護配置文件的行業中最好的或標準的做法是什麼?

編輯:我想解決方案是可移植的,就像將文件從一臺計算機複製到另一臺計算機不會破壞程序。 (對不起,請提前提及。)

回答

2

您應該使用自動編組器來編寫您的XML文件。幾年前,我使用了CastorXML,但是今天,可能有更多現代API用於此目的。

有了這個API,你基本上是:

  • 存放在一個簡單的POJO
  • 所有你的配置實例化編組器
  • 呼叫marshaller.write(的myconfig)

當你想加載您的配置:

  • 實例的Unmarshaller
  • 呼叫Marshaller.read(yourFile)

你可以描述XML映射配置文件或使用默認的Marshaller(1個屬性〜1個XML標籤)

就是這麼簡單。

編輯:

this thread搜索後,JAXB規範CastorXML的第一realease和Sun實現JAXB後,來到現在似乎是Java <-> XML映射的標準。

+0

這裏的交易斷路器是我有很多具有相同名稱的屬性,比如'player name'。所以當我想把'Alice'改成'Leo'時,我想確保它不會在這裏覆蓋'Bob'。 CastorXML能保證嗎?謝謝。 – YankeeWhiskey

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]"); 
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); 
相關問題