जावा पैकेज से एक गुण फ़ाइल लोड हो रही है


115

मुझे उन संपत्तियों की फ़ाइलों को पढ़ने की आवश्यकता है जो मेरे पैकेज संरचना में दफन हैं com.al.common.email.templates

मैंने सब कुछ करने की कोशिश की है और मैं इसका पता नहीं लगा सकता।

अंत में, मेरा कोड सर्वलेट कंटेनर में चल रहा होगा, लेकिन मैं किसी भी चीज़ के लिए कंटेनर पर निर्भर नहीं रहना चाहता। मैं JUnit परीक्षण मामलों को लिखता हूं और इसे दोनों में काम करने की आवश्यकता है।

जवाबों:


235

पैकेज में एक वर्ग से गुण लोड करते समय com.al.common.email.templatesआप उपयोग कर सकते हैं

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();

(सभी आवश्यक अपवाद हैंडलिंग जोड़ें)।

यदि आपकी क्लास उस पैकेज में नहीं है, तो आपको इनपुटस्ट्रीम को थोड़ा अलग तरीके से एक्वायर करना होगा:

InputStream in = 
 getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");

संबंधित पथ (बिना उन एक अग्रणी '/') में getResource()/ getResourceAsStream()मतलब है कि संसाधन निर्देशिका जो पैकेज कक्षा में है का प्रतिनिधित्व करता है के सापेक्ष की खोज की जाएगी।

का उपयोग करके java.lang.String.class.getResource("foo.txt")क्लासपैथ /java/lang/String/foo.txtपर (अपरिहार्य) फ़ाइल की खोज की जाएगी ।

एक निरपेक्ष पथ (एक जो '/' से शुरू होता है) का उपयोग करने का मतलब है कि वर्तमान पैकेज को अनदेखा किया गया है।


2
सुझाव: जब रिश्तेदार का उपयोग करने के लिए और जब पूर्ण पथ (शुरुआत में "/" के बिना) का उपयोग करने के लिए एक स्पष्टीकरण जोड़ें।
आरोन दिगुल्ला

1
क्या होगा यदि आपकी संपत्ति फ़ाइल src निर्देशिका के बाहर है, लेकिन अभी भी आपके परियोजना निदेशक के अंदर है?
योनातन

1
@ जोंनी: जावा के पास "प्रोजेक्ट डायरेक्टरी" की कोई धारणा नहीं है, कुछ आईडीई में ऐसा हो सकता है। लेकिन जहाँ तक जावा की बात है तो यह फ़ाइल सिस्टम पर कहीं न कहीं एक फाइल है जिसका क्लासपैथ से कोई संबंध नहीं है।
जोआचिम सॉर

50

जोआचिम सौर के उत्तर में जोड़ने के लिए, यदि आपको कभी भी स्थिर संदर्भ में ऐसा करने की आवश्यकता होती है, तो आप निम्न की तरह कुछ कर सकते हैं:

static {
  Properties prop = new Properties();
  InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
  prop.load(in);
  in.close()
}

(पूर्व की भांति अपवाद संभालना।)


यह जवाब है कि मेरे लिए काम किया है। मुझे काम का स्वीकृत जवाब नहीं मिला।
स्टीव एचएचएच

1
@cobralibre एक प्रॉपर्टी फ़ाइल को कैसे पढ़ता है जो resourcesएक mavenप्रोजेक्ट में फ़ोल्डर में रहती है
कसुन सियामबलपिटिया

16

निम्नलिखित दो मामले नाम के उदाहरण वर्ग से एक गुण फ़ाइल लोड करने से संबंधित हैं TestLoadProperties

केस 1: उपयोग कर रहे गुण फ़ाइल को लोड करें ClassLoader

InputStream inputStream = TestLoadProperties.class.getClassLoader()
                          .getResourceAsStream("A.config");
properties.load(inputStream);

इस स्थिति में गुण फ़ाइल root/srcसफल लोडिंग के लिए निर्देशिका में होना चाहिए ।

केस 2: उपयोग किए बिना गुण फ़ाइल लोड हो रही है ClassLoader

InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);

इस स्थिति में गुण फ़ाइल TestLoadProperties.classसफल लोडिंग के लिए फ़ाइल के समान निर्देशिका में होनी चाहिए ।

नोट: TestLoadProperties.java और TestLoadProperties.classदो अलग-अलग फाइलें हैं। पूर्व, .javaफ़ाइल, आमतौर पर एक परियोजना की src/निर्देशिका में पाई जाती है , जबकि बाद वाली, .classफ़ाइल, आमतौर पर इसकी bin/निर्देशिका में पाई जाती है ।


12
public class Test{  
  static {
    loadProperties();
}
   static Properties prop;
   private static void loadProperties() {
    prop = new Properties();
    InputStream in = Test.class
            .getResourceAsStream("test.properties");
    try {
        prop.load(in);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

10
public class ReadPropertyDemo {
    public static void main(String[] args) {
        Properties properties = new Properties();

        try {
            properties.load(new FileInputStream(
                    "com/technicalkeeda/demo/application.properties"));
            System.out.println("Domain :- " + properties.getProperty("domain"));
            System.out.println("Website Age :- "
                    + properties.getProperty("website_age"));
            System.out.println("Founder :- " + properties.getProperty("founder"));

            // Display all the values in the form of key value
            for (String key : properties.stringPropertyNames()) {
                String value = properties.getProperty(key);
                System.out.println("Key:- " + key + "Value:- " + value);
            }

        } catch (IOException e) {
            System.out.println("Exception Occurred" + e.getMessage());
        }

    }
}

2

अपनी लोड विधि के माध्यम से गुण वर्ग का उपयोग करते हुए , और मुझे लगता है कि आप इनपुट स्ट्रीम प्राप्त करने के लिए ClassLoader getResourceAsStream का उपयोग कर रहे हैं ।

आप कैसे नाम से गुजर रहे हैं, ऐसा लगता है कि यह इस रूप में होना चाहिए: /com/al/common/email/templates/foo.properties


1

मैं इस कॉल के साथ इस समस्या को हल करने में कामयाब रहा

Properties props = PropertiesUtil.loadProperties("whatever.properties");

अतिरिक्त, आपको अपनी जो भी फाइल डालना है, वह फाइल / src / main / Resources में डालनी होगी


9
आप कहाँ PropertiesUtilसे प्राप्त कर रहे हैं
बेन वाटसन

1

वर्ग के पैकेज से निपटने के लिए किसी के भी समान समाधान का उल्लेख नहीं किया गया है। मान लेना myfile.properties क्लासपाथ में है।

        Properties properties = new Properties();
        InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
        properties.load(in);
        in.close();

का आनंद लें


-2

कृपया नीचे दिए गए कोड का उपयोग करें:

    गुण p = नए गुण (); गुण p = नए गुण ();   
    StringBuffer पथ = नया StringBuffer ("com / al / common / email / टेम्पलेट्स /");StringBuffer पथ = नया StringBuffer ( "com / al / common / email / टेम्पलेट्स /" );  
    path.append ( "foo.properties");append ( "foo.properties" );
    InputStream fs = getClass ()। GetClassLoader ()InputStream fs = getClass ()। getClassLoader ()
                                    .getResourceAsStream (path.toString ());getResourceAsStream ( पथ toString ());

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.