2013-07-11 8 views
11

के लिए कॉन्फ़िगरेशन फ़ाइल को बनाए रखने का सबसे अच्छा तरीका मैं एक जावा एप्लिकेशन लिख रहा हूं जिसमें बहुत से समझने योग्य सेटिंग्स हैं। असल में मेरी कॉन्फ़िगरेशन संरचना इस तरह दिखती है:जावा एप्लिकेशन

 
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.... 

आपको यह विचार मिला। मैंने एक्सएमएल का उपयोग करने की कोशिश की लेकिन dom4j के साथ काम करना एक दर्द है, विशेष रूप से अलग-अलग और समान माता-पिता नोड्स में एक ही नाम के साथ बहुत सारे बच्चे नोड्स हैं और मुझे उन्हें बहुत बदलना होगा। अब तक सबसे अधिक परेशानी कम तरह से मैं की खोज

 
[Game 1] 
Game name: blah 
Player name: alice 
Player name: bob 
... 

[Game 2] 
... 

की तरह एक सादा पाठ फ़ाइल का उपयोग है लेकिन मुझे लगता है कि यह बहुत ही मौलिक है। तो जावा में कॉन्फ़िगरेशन फाइलों को बनाए रखने के लिए उद्योग में सबसे अच्छा या मानक अभ्यास क्या है?

EDIT: मैं पोर्टेबल होने का समाधान चाहता हूं, जैसे एक कंप्यूटर से दूसरे कंप्यूटर में फ़ाइल कॉपी करना प्रोग्राम को तोड़ नहीं देगा। (क्षमा करें इसे आगे का उल्लेख करना भूल जाएं।)

उत्तर

2

आपको अपनी XML फ़ाइल लिखने के लिए स्वचालित मार्शलर का उपयोग करना चाहिए था। कुछ साल पहले, मैंने CastorXML का उपयोग किया था, लेकिन आज, इस उद्देश्य के लिए शायद अधिक आधुनिक एपीआई हैं।

इस एपीआई, आप मूल रूप से साथ

:

  • स्टोर एक सरल POJO
  • में अपने सभी config एक Marshaller
  • कॉल marshaller.write (MyConfig)

जब आप चाहते हैं इन्स्तांत अपनी कॉन्फ़िगरेशन लोड करने के लिए:

  • एक Unmarshaller
  • कॉल Marshaller.read (Yourfile)

आप एक विन्यास फाइल में XML मानचित्रण का वर्णन या एक डिफ़ॉल्ट Marshaller (1 विशेषता ~ 1 एक्सएमएल टैग)

यह इतना आसान है उपयोग कर सकते हैं का दृष्टांत ।

संपादित करें:

this thread में एक खोज के बाद, JAXB विनिर्देश CastorXML के पहले realease और JAXB का सूर्य लागू होने के बाद आया था अब लगता है Java <-> XML मानचित्रण के लिए एक मानक माना जाता है।

+0

यहां सौदा ब्रेकर यह है कि मेरे पास 'प्लेयर नाम' जैसे ही नाम के साथ बहुत सारे गुण हैं। इसलिए जब मैं 'ऐलिस' को 'लियो' में बदलना चाहता हूं, तो मैं यह सुनिश्चित करना चाहता हूं कि यह 'बॉब' को ओवरराइट नहीं करता है। क्या CastorXML गारंटी दे सकता है? धन्यवाद। – YankeeWhiskey

5

जावा में सेटिंग्स/वरीयताओं को स्टोर करने का सबसे अच्छा तरीका Preferences API का उपयोग करना है।

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 उपयोग पर विचार करें, यह एक्सएमएल की तुलना में बहुत कम वर्बोज़ है उदाहरण के लिए,:

games: 
    - name: 'game 1' 
    players: ['Bob', 'Alice'] 
    ... 
    - name: 'game 2' 
    players: ['Bob', 'Alice'] 
    ... 

फिर आप विन्यास के साथ बातचीत करने के लिए YAML extension साथ Jackson लाइब्रेरी का उपयोग कर सकते हैं, के लिए कॉन्फ़िगरेशन को पार्स करने के लिए उदाहरण:

File configFile = new File("..."); 
ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 
Configuration config = mapper.readValue(configFile, Configuration.class); 
संबंधित मुद्दे