2012-04-16 15 views
15

क्या जावा में लोड की गई संपत्तियों को ढेर करना संभव है? उदाहरण के लिए मैं कर सकता हूं:एकाधिक गुण फ़ाइलों को लोड करना

Properties properties = new Properties(); 

properties.load(new FileInputStream("file1.properties")); 
properties.load(new FileInputStream("file2.properties")); 

और दोनों से संपत्तियों का उपयोग?

+1

हां, यदि गुणों के अलग-अलग नाम हैं। नहीं, अगर गुणों का एक ही नाम है। अगर संपत्ति के नाम संघर्ष करते हैं, तो आपको खुद को ढेर करना होगा। – Jesse

उत्तर

28

आप ऐसा कर सकते हैं:

Properties properties = new Properties(); 

properties.load(new FileInputStream("file1.properties")); 

Properties properties2 = new Properties(); 
properties2.load(new FileInputStream("file2.properties")); 

properties.putAll(properties2); 
+5

यदि file2.properties में फ़ाइल 1.properties में परिभाषित गुणों के समान गुण होते हैं, तो केवल file2.properties में उन गुणों के मान मौजूद होंगे। – Jesse

+0

दाएं। आप एक ही समय में दोनों गुणों को नहीं रख सकते हैं, क्योंकि कुंजी अद्वितीय होनी चाहिए। –

+0

कन्स्ट्रक्टर में डिफ़ॉल्ट गुण फ़ाइल को पास करने का अनुशंसित तरीका है। वह गुण विस्तारित करता है मानचित्र केवल एक कार्यान्वयन विस्तार है। – Puce

8

हाँ गुण टिके रहते हैं। PropertiesHashtable और load() बढ़ाता है प्रत्येक कुंजी-मूल्य जोड़ी पर बस put() पर कॉल करता है। Source से

प्रासंगिक कोड:

String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf); 
String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf); 
put(key, value); 

दूसरे शब्दों में, एक फ़ाइल से लोड हो रहा है वर्तमान प्रविष्टियों स्पष्ट नहीं है। हालांकि, ध्यान दें कि यदि दो फाइलों में एक ही कुंजी के साथ प्रविष्टियां होती हैं, तो पहला व्यक्ति ओवरराइट हो जाएगा।

+0

कन्स्ट्रक्टर में डिफ़ॉल्ट गुण फ़ाइल को पास करने का अनुशंसित तरीका है। वह गुण विस्तारित करता है मानचित्र केवल एक कार्यान्वयन विस्तार है। – Puce

+1

यह व्यवहार 'गुण 'अनुबंध द्वारा घोषित नहीं किया गया है (दूसरे शब्दों में, यह अनियंत्रित सुविधाओं का उपयोग करने के सभी संभावित परिणामों के साथ दस्तावेज नहीं है)। –

+0

यह सच है और इसे ध्यान में रखा जाना चाहिए। मैं केवल दस्तावेज व्यवहार के बजाय वास्तविक परिणामों में रुचि रखते थे। – tskuzzy

3

असल में, हाँ। तुम यह केर सकते हो। यदि किसी भी संपत्ति ओवरलैप हो जाती है, तो नई लोड की गई संपत्ति पुरानी होगी।

2

हां, आपको कन्स्ट्रक्टर में डिफ़ॉल्ट गुण फ़ाइल को पास करने की आवश्यकता है। इस तरह आप उन्हें चेन कर सकते हैं।

उदा .:

Properties properties1 = new Properties(); 
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file1.properties"))){ 
    properties1.load(bis); 
} 

Properties properties2 = new Properties(properties1); 
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file2.properties"))){ 
    properties2.load(bis); 
} 
+0

मुझे इसे पहले पसंद आया, लेकिन अब मेरे पास आरक्षण है। BufferedInputStream के उपयोग को अलग करना, यह ओपी के कोड से बेहतर कैसे है? दोनों स्थितियों में, आप दूसरी फ़ाइल को सीधे उस प्रॉपर्टी ऑब्जेक्ट में लोड कर रहे हैं जिसमें पहली फ़ाइल के गुण होते हैं। लेकिन इस उदाहरण में, आप एक नई संपत्ति वस्तु बना रहे हैं। क्या फायदा है? – datguy

+0

यदि आप इस विधि का उपयोग करते हैं, और किसी कारण से गुणों पर पुनरावृत्त कर रहे हैं, तो आपको ** को फिर से शुरू करने के लिए 'propertyNames() 'या' stringPropertyNames() 'का उपयोग करना होगा। यदि आप अंतर्निहित 'मानचित्र' विधियों जैसे 'एंट्रीसेट() 'या' कीसेट() 'का उपयोग करते हैं, तो कन्स्ट्रक्टर में निर्दिष्ट गुण शामिल नहीं होंगे। –

1

यह भी काम करना चाहिए। यदि फ़ाइल 1.properties और file2.properties में समान संपत्ति परिभाषित की गई है, तो file2.properties में संपत्ति प्रभावी होगी।

Properties properties = new Properties(); 
    properties.load(new FileInputStream("file1.properties")); 
    properties.load(new FileInputStream("file2.properties")); 

अब गुण मानचित्र दोनों फाइलों के गुण होंगे। यदि फ़ाइल 1 और file2 में एक ही कुंजी दिखाई देती है, तो फ़ाइल 1 से कुंजी का मान फ़ाइल 2 में मान वाले गुणों में अपडेट किया जाएगा क्योंकि मैं फ़ाइल 1 को कॉल कर रहा हूं, फिर फ़ाइल 2।

1

आप इसे एक और अधिक गतिशील कर सकते हैं, जो अनिश्चित संख्या में फाइलों के साथ काम कर रहे हैं।

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

public static Properties loadPropertiesFiles(LinkedList<String> files) { 
    try { 
     Properties properties = new Properties(); 

       for(String f:files) { 
        Resource resource = new ClassPathResource(f); 
        Properties tempProp = PropertiesLoaderUtils.loadProperties(resource); 
        properties.putAll(tempProp); 
       } 
       return properties; 
    } 
    catch(IOException ioe) { 
       return new Properties(); 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^