2012-12-30 11 views
32

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

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(); 

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

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

जब मैं ग्रहण सब कुछ पर इस चला रहा हूँ ठीक चल रहा है। लेकिन जैसे ही मैंने cmd लाइन नल पॉइंटर एक्सेप्शन से एप्लिकेशन चलाने की घटनेवाला है ..

कमांड लाइन तैनाती पदानुक्रम इस प्रकार है प्रयास:

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

पदानुक्रम:

  1. SwingDemo
    • CustomDialog.java
    • Test.properties

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

java SwingDemo.CustomDialog 

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

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

उत्तर

61

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

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

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

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

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

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

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

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

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

और अंत में, के रूप में प्रलेखन इंगित करता है,

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

का प्रयोग कर एक Test.properties वर्ग फू के रूप में ही पैकेज में स्थित फ़ाइल लोड होगा।

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

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

+2

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

6

एक जार के अंदर संसाधन फ़ोल्डर से फ़ाइलों तक पहुंचने का सबसे अच्छा तरीका यह है कि getResourceAsStream के माध्यम से इनपुटस्ट्रीम का उपयोग करना है।

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; 
    } 
} 
+0

बहुत उपयोगी उत्तर। मैं अधिक बार उठाने में सक्षम होना चाहता हूं: डी। मुझे लगता है कि यह कोड में इनपुटस्ट्रीम = getClass() में इनपुटस्ट्रीम के साथ भी काम करने में सक्षम होगा। GetResourceAsStream (resourcePath); – xXxpRoGrAmmErxXx

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