जावा में पठन गुण फ़ाइल


105

मेरे पास एक गुण फ़ाइल को पढ़ने के लिए निम्नलिखित कोड है:

Properties prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();           
InputStream stream = loader.getResourceAsStream("myProp.properties");
prop.load(stream);

मुझे अंतिम पंक्ति में एक अपवाद मिलता है। विशेष रूप से:

Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:46)
at Assignment1.BaseStation.main(BaseStation.java:87)

धन्यवाद, निकोस

जवाबों:


89

आपके अपवाद के आधार पर, InputStreamशून्य है, इसका मतलब है कि क्लास लोडर को आपकी गुण फ़ाइल नहीं मिल रही है। मैं अनुमान लगा रहा हूं कि myProp.properties आपके प्रोजेक्ट के मूल में है, अगर ऐसा है, तो आपको एक पूर्ववर्ती स्लैब की आवश्यकता है:

InputStream stream = loader.getResourceAsStream("/myProp.properties");

मेरी फ़ाइल पदानुक्रम है: src -> myPackage -> myClass.java, myProp.properties। मैंने वही किया जो आपने मुझे सलाह दी थी, लेकिन यह अभी भी उसी अपवाद को फेंकता है
निकोस 27'11

getResourceAsStreamक्लासपाथ पर फ़ाइल के लिए खोज करता है। यदि आपकी प्रॉपर्टीज़ फ़ाइल पैकेज निर्देशिका में है myPackage, तो /myPackage/myProp.propertiesपथ के रूप में उपयोग करें ।
जेस्पर

2
@Mark इलियट क्या होगा अगर मेरे पास confमेरी सभी कॉन्फ़िगरेशन फ़ाइलों को संग्रहीत करने के लिए एक पैकेज है और मेरी फ़ाइल पदानुक्रम है:, myproject ->src, conf, testमैं पूर्ववर्ती स्लैश जोड़कर संपत्तियों को कैसे लोड करूं?
रोजर रे

54


आप इस पृष्ठ पर जानकारी प्राप्त कर सकते हैं:
http://www.mkyong.com/java/java-properties-file-examples/

Properties prop = new Properties();
try {
    //load a properties file from class path, inside static method
    prop.load(App.class.getClassLoader().getResourceAsStream("config.properties"));

    //get the property value and print it out
    System.out.println(prop.getProperty("database"));
    System.out.println(prop.getProperty("dbuser"));
    System.out.println(prop.getProperty("dbpassword"));

} 
catch (IOException ex) {
    ex.printStackTrace();
}

3
मत भूलना बंद करने के लिए Readerमें prop.load(reader), दस्तावेज़ के अनुसार:The specified stream remains open after this method returns
Evandro सिल्वा

25

आप ResourceBundleगुण फ़ाइल को पढ़ने के लिए कक्षा का उपयोग कर सकते हैं ।

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");

1
ResourceBundle rb = ResourceBundle.getBundle ("myProp");
४६

2
यह दृष्टिकोण i18n के लिए अनुशंसित है।
एक और

15
Properties prop = new Properties();

try {
    prop.load(new FileInputStream("conf/filename.properties"));
} catch (IOException e) {
    e.printStackTrace();
}

conf/filename.properties आधार पर परियोजना रूट dir


7

आप इस कीवर्ड का उपयोग नहीं कर सकते हैं जैसे -

props.load(this.getClass().getResourceAsStream("myProps.properties"));

एक स्थिर संदर्भ में।

सबसे अच्छी बात आवेदन के संदर्भ को पकड़ना होगा -

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/app-context.xml");

फिर आप क्लासपथ से संसाधन फ़ाइल लोड कर सकते हैं -

//load a properties file from class path, inside static method
        prop.load(context.getClassLoader().getResourceAsStream("config.properties"));

यह स्थैतिक और गैर-स्थिर दोनों संदर्भों के लिए काम करेगा और सबसे अच्छी बात यह है कि यह गुण फ़ाइल किसी भी पैकेज / फ़ोल्डर में एप्लिकेशन के क्लासलैथ में शामिल हो सकता है।


4
ApplicationContext केवल वसंत आवेदन के मामले में उपलब्ध है
जोरो

6

आपकी फ़ाइल com/example/foo/myProps.propertiesक्लासपाथ में उपलब्ध होनी चाहिए । फिर इसे इस प्रकार लोड करें:

props.load(this.getClass().getResourceAsStream("myProps.properties"));

4

अगर आपका config.properties src / main / resource डाइरेक्टरी में नहीं है और यह प्रोजेक्ट के रूट डायरेक्टरी में है तो आपको नीचे कुछ करने की जरूरत है: -

Properties prop = new Properties();          
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);

3

सुनिश्चित करें कि फ़ाइल का नाम सही है और फ़ाइल वास्तव में वर्ग पथ में है। getResourceAsStream()अगर यह अंतिम पंक्ति को अपवाद को फेंकने का कारण नहीं है तो अशक्त हो जाएगा।

यदि myProp.properties आपकी परियोजना की मूल निर्देशिका में है, तो /myProp.propertiesइसके बजाय का उपयोग करें ।


मेरी फ़ाइल पदानुक्रम है: src -> myPackage -> myClass.java, myProp.properties। मैंने वही किया जो आपने मुझे सलाह दी थी, लेकिन यह अभी भी उसी अपवाद को फेंकता है
निकोस

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

मुझे प्रमुख स्लैश के बिना पहले स्थान पर फेंका गया अपवाद मिल रहा था। यह अभी भी काम नहीं कर रहा है।
निकोस

3

आप फ़ाइल को पढ़ने के लिए java.io.InputStream का उपयोग कर सकते हैं जैसा कि नीचे दिखाया गया है:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 

जावा में FileStream में File Convert कैसे करें? मैं फ़ाइल एपीआई का उपयोग कर

3

संदर्भ loader.getResourceAsStream("myPackage/myProp.properties")को देखते हुए इस्तेमाल किया जाना चाहिए।

अग्रणी विधि के '/'साथ काम नहीं करता है ClassLoader.getResourceAsStream(String)

वैकल्पिक रूप से आप Class.getResourceAsStream(String)विधि का उपयोग कर सकते हैं , जो '/'यह निर्धारित करने के लिए उपयोग करता है कि क्या पथ पूर्ण है या वर्ग स्थान के सापेक्ष है।

उदाहरण:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")

2

यदि आपके गुण फ़ाइल पथ और आपके जावा वर्ग पथ समान हैं, तो आपको यह करना चाहिए।

उदाहरण के लिए:

src / myPackage / MyClass.java

src / myPackage / MyFile.properties

Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);

2

वर्तमान उत्तरों में से कोई भी InputStreamबंद नहीं दिखाया जा रहा है (यह एक फ़ाइल डिस्क्रिप्टर लीक करेगा), और / या .getResourceAsStream()जब संसाधन नहीं मिला है, तो यह अशक्त लौटने से निपटता है (यह NullPointerExceptionभ्रामक संदेश के साथ ले जाएगा "inStream parameter is null")। आपको निम्नलिखित की तरह कुछ चाहिए:

String propertiesFilename = "server.properties";
Properties prop = new Properties();
try (var inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFilename)) {
    if (inputStream == null) {
        throw new FileNotFoundException(propertiesFilename);
    }
    prop.load(inputStream);
} catch (IOException e) {
    throw new RuntimeException(
                "Could not read " + propertiesFilename + " resource file: " + e);
}

1

पढ़ने के लिए अपने मूल आदेश के साथ गुण फ़ाइल:

    File file = new File("../config/edc.properties");
    PropertiesConfiguration config = new PropertiesConfiguration();
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
    layout.load(new InputStreamReader(new FileInputStream(file)));

    for(Object propKey : layout.getKeys()){
        PropertiesConfiguration propval =  layout.getConfiguration();
        String value = propval.getProperty((String) propKey).toString();
        out.print("Current Key:" + propkey + "Current Value:" + propval + "<br>");
    }

1

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

    Properties prop = new Properties();
    try(InputStream fis = new FileInputStream("myProp.properties")) {
        prop.load(fis);
    }
    catch(Exception e) {
        System.out.println("Unable to find the specified properties file");
        e.printStackTrace();
        return;
    }

try-with-resourcesब्लॉक में फ़ाइल इनपुट स्ट्रीम की तात्कालिकता पर ध्यान दें । चूँकि FileInputStreamस्वत: पता लगाने योग्य है, यह try-with-resourcesब्लॉक से बाहर निकलने के बाद स्वचालित रूप से बंद हो जाएगा । यदि आप एक साधारण tryब्लॉक का उपयोग करना चाहते हैं , तो आपको ब्लॉक fis.close();में इसका उपयोग करके स्पष्ट रूप से बंद करना होगा finally


0

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

        FileReader reader = new FileReader("Config.properties");

        Properties prop = new Properties();
        prop.load(reader);

-2

नीचे से src से शुरू होने वाले पथ को निर्दिष्ट करें:

src/main/resources/myprop.proper
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.