2009-04-27 13 views
59

जावा वेब एप्लिकेशन में, मान लीजिए कि मैं क्लासस्पैट में इनपुट एक्सचेंज स्ट्रीम प्राप्त करना चाहता हूं (यानी स्रोत फ़ोल्डर के अंदर), कैसे करें मैं करता हूं?क्लासपाथ संसाधन (एक्सएमएल फाइल) से इनपुटस्ट्रीम प्राप्त करना

उत्तर

73

ClassLoader.getResourceAsStream()

जैसा कि नीचे दी गई टिप्पणी में बताया गया है, यदि आप बहु-ClassLoader पर्यावरण (जैसे इकाई परीक्षण, वेबपैप्स इत्यादि) में हैं तो आपको Thread.currentThread().getContextClassLoader() का उपयोग करने की आवश्यकता हो सकती है। http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 देखें।

+0

एक कोड उदाहरण के लिए व्यक्तिगत पोस्ट देखें: एक पूर्ण संसाधन नाम इस कलन विधि का उपयोग दिए गए संसाधन नाम से निर्माण किया है प्रतिनिधिमंडल से पहले, http://tshikatshikaaa.blogspot.nl/2012/07/maven-how-to-access-filesdata-in.html – JVerstry

+12

यदि आप एक बहु क्लासलोडर वातावरण (जैसे यूनिट परीक्षण/वेबपैप्स इत्यादि) में हैं, तो आपको इस थ्रेड का उपयोग करने की आवश्यकता हो सकती है .currentThread()। getContextClassLoader()। http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388 – khylo

+0

कृपया अपने उत्तर में @ खिलो का सुझाव जोड़ें! – froginvasion

5

someClassWithinYourSourceDir.getClass()। GetResourceAsStream();

+0

या' getClass()। GetResourceAsStream (" ... ")' आदि – rogerdpack

10

यह इस बात पर निर्भर करता है कि वास्तव में एक्सएमएल फ़ाइल कहां है। क्या यह स्रोत फ़ोल्डर में है ("डिफ़ॉल्ट पैकेज" या "रूट" में) या कक्षा के समान फ़ोल्डर में?

पूर्व मामले में, आपको फ़ाइल खोजने के लिए "/file.xml" (प्रमुख स्लैश नोट करें) का उपयोग करना होगा और इससे कोई फर्क नहीं पड़ता कि आप किस वर्ग का उपयोग करने के लिए उपयोग करते हैं।

यदि XML फ़ाइल कुछ वर्ग के बगल में है, तो SomeClass.class.getResourceAsStream() केवल फ़ाइल नाम के साथ जाने का तरीका है।

10

ClassLoader.class.getResourceAsStream("/path/to/your/xml") और सुनिश्चित करें कि आपकी संकलन स्क्रिप्ट आपके क्लासस्पैट में जहां XML फ़ाइल की प्रतिलिपि बना रही है।

26
ClassLoader.class.getResourceAsStream("/path/file.ext"); 
+0

लेकिन यदि वेब परिनियोजन है टोमकैट में ऐप इस तरह से त्रुटि प्राप्त करेगा: 'java.lang.NullPointerException: null', और मुझे लगता है कि सबसे आसान तरीका 'नया क्लासपाथ रिसोर्स ("/ path/to/your/file") है। getInputStream() ' – zhuguowei

4
"getResourceAsStream()" इस जवाब में विकल्प मेरे लिए काम नहीं किया में से कुछ

, लेकिन यह एक किया था:।

SomeClassWithinYourSourceDir.class.getClassLoader() getResourceAsStream ("yourResource");

0

डिफ़ॉल्ट रूप से, प्रत्येक संसाधन एक वेब अनुप्रयोग में classpath वेब-INF/कक्षाएं तैनात युद्ध में फ़ोल्डर के अंतर्गत कॉपी किया जाता है करने के लिए जोड़ा।

आप इस का प्रबंधन कर सकते हैं, जबकि के माध्यम से ग्रहण में आवेदन के विकास:

सही परियोजना के लिए क्लिक करें -> गुण -> जावा बिल्ड पथ -> स्रोत टैब -> डिफ़ॉल्ट आउटपुट फ़ोल्डर

अपने सर्वलेट में, आप '/' के साथ अपने पथ को उपसर्ग करके संसाधन तक पहुंच सकते हैं जो वेब-आईएनएफ/कक्षा पर इंगित करता है।

उदाहरण के लिए, वेब-INF/कक्षाएं तहत पीडीएफ-sample.pdf उपयोग करने के लिए है, तो आप उपयोग कर सकते हैं निम्नलिखित:

getClass().getResourceAsStream("/pdf-sample.pdf") 

यह tutorial बहुत अच्छी तरह से पढ़ने के संभावित तरीकों पर बताते हैं जावा एप्लिकेशन में क्लासपाथ से संसाधन फ़ाइल, यह पढ़ने योग्य है।

0

मैंने प्रस्तावित समाधान की कोशिश की और फाइल नाम में फिसल जाने के लिए मेरे लिए काम नहीं किया, उदाहरण: ...()। GetResourceAsStream ("/ my.properties"); शून्य वापस

स्लैश को हटाकर काम किया गया: .... getResourceAsStream ("my।गुण ");

यहाँ डॉक एपीआई से है:

If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'. 
Otherwise, the absolute name is of the following form: 

    modified_package_name/name 

Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e'). 
संबंधित मुद्दे