java - GetClass() द्वारा फ़ाइल लोड हो रहा है। GetResource()




file load (2)

मैंने getClass.getResource(path) का उपयोग करके संसाधन फ़ाइल लोड करने के तरीके का पालन किया है। कोड का स्निपेट यहां है:

String url = "Test.properties";

System.out.println("Before printing paths..");
System.out.println("Path2: "+ getClass().getResource(url).getPath());

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
i_propConfig.load(inputStream);
inputStream.close();

मैंने इसे पदानुक्रम के साथ ग्रहण में कॉन्फ़िगर किया है (स्रोत के तहत स्विंगडेमो नामक एक फ़ोल्डर है। स्विंगडेमो में मेरी जावा फ़ाइल के साथ-साथ संसाधन फ़ाइल भी है) ...

  1. src
    • SwingDemo
      1. CustomDialog.java
      2. Test.properties

जब मैं इसे ग्रहण पर चला रहा हूं तो सब कुछ ठीक चल रहा है। लेकिन जैसे ही मैं cmd ​​लाइन नल पॉइंटर अपवाद से ऐप्स चलाने का प्रयास करता हूं ..

कमांड लाइन परिनियोजन पदानुक्रम निम्नानुसार है:

फ़ोल्डर: D:\Work\Java Progrms\SwingDemo

पदानुक्रम:

  1. SwingDemo
    • CustomDialog.java
    • Test.properties

सबसे पहले मैंने कमांड लाइन (javac CustomDialog.java ) से SwingDemo फ़ोल्डर के अंदर इस फ़ाइल को संकलित किया। फिर मैं एक प्रोग्राम को जावा प्रोग्राम फ़ोल्डर में ले जाता हूं (जैसा कि मैंने .java क्लास के अंदर पैकेज का उल्लेख किया है) और प्रसिद्ध का उपयोग करके ऐप्स चलाएं

java SwingDemo.CustomDialog

जब मैंने पहले नया FileInputStream ("path") इस्तेमाल किया था, तो मैं इसी तरह के चरणों का पालन करता था। इस फैशन को करने के बाद मुझे शून्य सूचक अपवाद मिल रहा है ..

मुझे लगता है कि getClass().getResource(url) किसी विशिष्ट निर्देशिका से फ़ाइल लोड नहीं कर सकता है। यही कारण है कि मैंने संसाधन को अपनी जावा फ़ाइल के समान निर्देशिका में रखा। यह ग्रहण में ठीक चला गया। लेकिन जब मैं कमांड लाइन से चलाता हूं तो यह त्रुटि क्यों दे रहा है।


एक जार के अंदर संसाधन फ़ोल्डर से फ़ाइलों तक पहुंचने का सबसे अच्छा तरीका यह है कि getResourceAsStream माध्यम से getResourceAsStream का उपयोग करना है। यदि आपको अभी भी एक फ़ाइल इंस्टेंस के रूप में संसाधन की आवश्यकता है तो आप संसाधन को एक अस्थायी फ़ाइल में स्ट्रीम के रूप में कॉपी कर सकते हैं (JVM बाहर निकलने पर अस्थायी फ़ाइल हटा दी जाएगी):

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

getClass().getResource() संसाधन लोड करने के लिए वर्ग लोडर का उपयोग करता है। इसका मतलब है कि संसाधन को लोड करने के लिए कक्षा में होना चाहिए।

ग्रहण के साथ ऐसा करते समय, स्रोत फ़ोल्डर में जो कुछ भी आप डालते हैं वह ग्रहण द्वारा "संकलित" होता है:

  • .java फ़ाइलों को .class फ़ाइलों में संकलित किया गया है जो बिन निर्देशिका (डिफ़ॉल्ट रूप से) पर जाते हैं
  • अन्य फ़ाइलों को बिन निर्देशिका में कॉपी किया गया है (पैकेज / फ़ोल्डर किराया का सम्मान)

ग्रहण के साथ प्रोग्राम लॉन्च करते समय, बिन निर्देशिका इस प्रकार क्लासपाथ में होती है, और चूंकि इसमें Test.properties फ़ाइल होती है, इसलिए यह फ़ाइल getResource() या getResourceAsStream() करके क्लास लोडर द्वारा लोड की जा सकती है।

यदि यह कमांड लाइन से काम नहीं करता है, तो ऐसा इसलिए है क्योंकि फ़ाइल क्लासपाथ में नहीं है।

ध्यान दें कि आपको नहीं करना चाहिए

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));

संसाधन लोड करने के लिए। क्योंकि यह केवल तभी काम कर सकता है जब फाइल फ़ाइल सिस्टम से लोड हो। यदि आप अपने ऐप को जार फ़ाइल में पैकेज करते हैं, या यदि आप किसी नेटवर्क पर कक्षाएं लोड करते हैं, तो यह काम नहीं करेगा। इनपुटस्ट्रीम प्राप्त करने के लिए, बस उपयोग करें

getClass().getResourceAsStream("Test.properties")

और अंत में, जैसा कि दस्तावेज इंगित करता है,

Foo.class.getResourceAsStream("Test.properties")

क्लास फू के समान पैकेज में स्थित test.properties फ़ाइल लोड करेगा।

Foo.class.getResourceAsStream("/com/foo/bar/Test.properties")

पैकेज com.foo.bar में स्थित test.properties फ़ाइल लोड करेगा।





embedded-resource