2013-10-24 11 views
5

मुझे getResourceAsStream() द्वारा भ्रमित कर दिया गया है;फ़ाइल के लिएResourceAsStream (फ़ाइल) खोज कहां मिलती है?

मेरे पैकेज संरचना की तरह दिखता है:

\src 
|__ net.floodlightcontroller // invoked getResourceAsStream() here 
|__ ... 
|__ resources 
    |__ floodlightdefault.properties //target 
    |__ ... 

और मैं floodlightdefault.properties से पढ़ना चाहते हैं। यहाँ मेरी कोड net.floodlightcontroller पैकेज में झूठ बोल रही है,:

package net.floodlightcontroller.core.module; 
// ... 
InputStream is = this.getClass().getClassLoader() 
       .getResourceAsStream("floodlightdefault.properties"); 

लेकिन यह विफल रहा है, is == null रही। तो मैं सोच रहा हूं कि file के लिए वास्तव में कैसे करता है। मेरा मतलब है कि यह कुछ PATH एस या एक निश्चित आदेश के माध्यम से काम करता है?

यदि हां, तो getResourceAsStream() उन स्थानों को कॉन्फ़िगर कैसे करें?

Thx!

+0

क्या आपने संसाधन निर्देशिका जोड़ दी है अपने कोड को चलाने के दौरान एक कक्षा में? आम तौर पर, getResourceAsStream का व्यवहार क्लासलोडर कार्यान्वयन पर निर्भर करता है। –

+0

आम तौर पर यह भी 'यह' संदर्भित करता है पर निर्भर करेगा। – Radiodef

+0

अपनी शून्य समस्या को ठीक करने के लिए, शुरुआत में दो चीजें हैं जिन्हें मैं देखता हूं। सबसे पहले, ऐसा लगता है कि आपको अपनी निर्देशिका को 'संसाधनों/floodlightdefault.properties" में बदलने की जरूरत है। दूसरा, यह तरीका आपकी बिल्ड निर्देशिका के अंदर संसाधन की तलाश कर रहा है और आपके द्वारा दिखाए गए निर्देशिका संरचना आईडीई प्रोजेक्ट का स्रोत फ़ोल्डर प्रतीत होता है। यद्यपि यदि आपने प्रोजेक्ट में संसाधन जोड़े हैं, तो आईडीई को फ़ाइलों को स्वचालित रूप से बिल्ड निर्देशिका में कॉपी करना चाहिए। नेटबींस के साथ त्वरित परीक्षण में, मेरे संसाधन केवल शून्य हो जाते हैं यदि मैं उन्हें _both_ build और src फ़ोल्डर से हटा देता हूं। – Radiodef

उत्तर

7

जब आप this.getClass().getClassLoader().getResourceAsStream(File) पर कॉल करते हैं, तो जावा this द्वारा इंगित कक्षा के समान निर्देशिका में फ़ाइल की तलाश करता है। इसलिए यदि आपके फ़ाइल संरचना है:

\src 
|__ net.floodlightcontroller.core.module 
    |__ Foo.java 
    |__ floodlightdefault.properties //target 
    |__ ... 

और बस कॉल: तरह देखने के लिए

InputStream is = Foo.class.getClassLoader() 
      .getResourceAsStream("..\..\..\resources\floodlightdefault.properties"); 

अभी तक बेहतर, अपने पैकेज संरचना को बदल:

\src 
|__ net.floodlightcontroller.core.module 
    |__ Foo.java 
|__ ... 
|__ resources 
    |__ floodlightdefault.properties //target 
    |__ ... 

तो फिर तुम फोन करने के लिए चाहता हूँ कॉल करें:

InputStream is = Foo.class.getClassLoader() 
      .getResourceAsStream("floodlightdefault.properties"); 
+0

@ जोन्स धन्यवाद, और मैंने वर्ग पथ में 'संसाधन' जोड़ा, यह भी काम करता है। – qweruiop

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