2009-09-16 4 views
34

में एकाधिक मान ऐसा लगता है कि java.util.Properties एक मूल्य प्रति प्रोपेरी कुंजी मानता है। यही कारण है,java.util.Properties

foo=1 
foo=2 

की उम्मीद नहीं है,

वहाँ बहु मूल्य संपत्ति चादर इस तरह की है, जो भी लोड तरीका प्रदान करता है के लिए एक वर्ग है?

+0

संभावित डुप्लिकेट [मैं गुण फ़ाइल में मूल्य कैसे निर्दिष्ट करूं ताकि उन्हें संसाधन बंडल # getStringArray का उपयोग करके पुनर्प्राप्त किया जा सके?] (Http://stackoverflow.com/questions/226050/how-do-i-specify-values- इन-ए-प्रॉपर्टीज-फ़ाइल-वे-वे-री-रीरीव--रीस-रीसो) –

उत्तर

60

प्रयास करें:

foo=1,2 

String[] foos = properties.getProperty("foo").split(","); 
+1

सरल और सुरुचिपूर्ण, धन्यवाद! – ClueMinus

+10

यदि संपत्ति foo नहीं मिला है तो उपरोक्त रेखा एक NullPointerException फेंक देगी। तो संपत्ति की आवश्यकता होने पर संपत्ति की जांच करना सुनिश्चित करें या अपवाद को फेंक दें/फेंक दें। यदि संपत्ति वैकल्पिक है तो Properties.getProperty ("foo", "") .split (",") एक सुरक्षित विकल्प हो सकता है। –

+2

@ lee-theobald: अपनी संपत्ति वर्ग को ग्रोवी क्लास बनाएं और आप यह कर सकते हैं: 'स्ट्रिंग [] foos = Properties.getProperty ("foo") ?.विभाजित (",") 'और foo एक एनपीई प्राप्त करने के बजाय शून्य होगा :) – rjohnston

20

java.util.Properties समारोह बहुत ही सीमित है। आप का समर्थन सूची चाहते हैं, आप अपाचे कॉमन्स विन्यास से PropertyConfiguration कोशिश चाहते हो सकता है,

http://commons.apache.org/configuration/userguide/howto_properties.html#Using_PropertiesConfiguration

इसके साथ

, आप अपनी सूची में किसी भी सीमांकक सेट कर सकते हैं और यह आपके लिए स्वचालित रूप से विभाजित कर देगा। आप गुण फ़ाइल में अन्य फैंसी चीजें भी कर सकते हैं। उदाहरण के लिए,

foo=item1, item2 
bar=${foo}, item3 
number=123 

आप इसे इस तरह, प्राप्त कर सकते हैं निक द्वारा

Configuration config = new PropertiesConfiguration("your.properties"); 
String[] items = config.getStringArray("bar"); // return {"item1", "item2", "item3"} 
int number = config.getInt("number", 456); // 456 is default value 
+0

क्या यह केवल संपत्ति फ़ाइलों के लिए काम करता है, या यह जावा "-D" कमांड लाइन प्रॉपर्टी पैरामीटर के लिए भी काम कर सकता है? – David

4

सही जवाब।

या, यदि आप प्रत्येक मान के लिए एक अलग SUBNAME दे सकते हैं, तो आप अपने गुण होना हो सकता है:

my.properties 

    foo.title=Foo 
    foo.description=This a big fat foo. 
+1

लेकिन इस दृष्टिकोण का उपयोग करके, आप foo के सभी मुख्य गुणों को किसी सूची/सरणी/foo के संग्रह में कैसे ले जाएंगे? और चूंकि आपने उपनाम के रूप में दिखाया है, तो एक व्यक्ति को लगता है कि हम रूट ऑब्जेक्ट के रूप में एक बार संपत्ति को पकड़ना चाहते हैं, फिर उपनाम के उपनामों के माध्यम से इसके मूल्य प्राप्त करने के लिए कुंजी के रूप में पुन: प्रयास करें। यह मुश्किल हिस्सा है। उन्हें व्यक्तिगत गुणों के रूप में एक्सेस करना सरल है, लेकिन अधिकांश लोग बहु-मूल्यवान गुणों के लिए ऐसा नहीं कर रहे हैं। – David

0

यह लोड विधि लेकिन आप एक अपाचे इस्तेमाल कर सकते हैं उन्हें स्टोर करने के लिए एक जगह उपलब्ध नहीं कराएगा कॉमन्स multivaluemap: "। एक multiValueMap एक और नक्शा से सजाया गया है, यह एक कुंजी के लिए एक से अधिक मूल्य के लिए अनुमति देने"

इस बार http अनुरोध पैरामीटर के लिए एक आवश्यकता है ...

+०१२३५१६४१०६

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html

0

आप एक अधिक जटिल उदाहरण आप निम्न का उपयोग कर सकते हैं:

# pairs of properties 
source1=foo 
target1=bar 
source2=anotherFoo 
target2=regardingBar 
source3= ... 

अपने कोड में आप खोज करना होगा:

Map<String, String> myMap = new HashMap<>(); 
for (int i=1; i<max; i++) { 
    String source = properties.get("source" + i); 
    String target = properties.get("target" + i); 
    if (source == null || target == null) { 
    break; 
    } 
    myMap.put(source, target); 
} 

वापसी: गुण फ़ाइल को अद्यतन करने। यदि आप मान * 2 हटाते हैं, तो निम्नलिखित सभी मान जोड़े नहीं जाएंगे। सुधार करने के लिए आप ब्रेक को जारी रखने के साथ प्रतिस्थापित करना चाहते हैं और अधिकतम स्वीकृत जोड़े से चिपके रह सकते हैं।

संबंधित मुद्दे