2009-12-14 24 views
19

के भीतर क्लासपाथ संसाधन मेरे पास एक प्रोजेक्ट ए है, जिसमें कुछ जावा फ़ाइलें और क्लासपाथ संसाधन R.txt शामिल है। प्रोजेक्ट के भीतर मैं ClassLoader.getSystemResource ("R.txt") का उपयोग करता हूं; आरटीटीटी को पुनः प्राप्त करने के लिए।जार

तब मेरे पास एक प्रोजेक्ट बी है जिसमें प्रोजेक्ट ए की जार-फ़ाइल शामिल है। अब getSystemResource ("R.txt") को टेक्स्टफाइल नहीं मिलेगा (और हाँ, यह अभी भी जार फ़ाइल की जड़ में है)। यहां तक ​​कि किसी अन्य साइट पर सुझाए गए "/R.txt" को भी कोशिश नहीं की गई। कोई विचार?

उत्तर

42

getSystemResource के बजाय getResource का उपयोग सिस्टम के बजाए दिए गए क्लासलोडर के लिए विशिष्ट संसाधन का उपयोग करने के लिए करें।

URL resource = getClass().getClassLoader().getResource("R.txt"); 
URL resource = Foo.class.getClassLoader().getResource("R.txt"); 
URL resource = getClass().getResource("/R.txt"); 
URL resource = Foo.class.getResource("/R.txt"); 

नोट में स्लैश जब Class.getResource बजाय ClassLoader.getResource बुला;: उदाहरण के लिए, निम्न में से किसी की कोशिश Class.getResource क्लास युक्त पैकेज के सापेक्ष है जब तक कि आपके पास अग्रणी स्लैश न हो, जबकि ClassLoader.getResource हमेशा पूर्ण होता है।

+0

कमाल। यह पूरी तरह से मेरी समस्या हल हो गया। सुपरफास्ट इनपुट // जोहान –

+0

एक और संबंधित प्रश्न: हम इस यूआरएल संसाधनों से इनपुट स्ट्रीम प्राप्त कर सकते हैं, लेकिन हम लौटाए गए यूआरएल ऑब्जेक्ट से ** फाइल ** ऑब्जेक्ट कैसे बना सकते हैं। मैंने "URLObject.toURI()" के साथ एक ** यूआरआई ** ऑब्जेक्ट बनाने की कोशिश की, और फ़ाइल बनाने के लिए इस यूआरआई ऑब्जेक्ट का उपयोग करें, दुर्भाग्य से, यह "यूआरआई पदानुक्रमित अपवाद नहीं है" फेंकता है। क्या आप मुझे कुछ मदद दे सकते हैं? बहुत बहुत धन्यवाद । –

+2

@EnsomHodder: उम, सुनिश्चित नहीं है - लेकिन सभी संसाधन * फ़ाइलें नहीं हैं - विशेष रूप से, यह एक जार फ़ाइल में नहीं होगा। –

5

स्पष्ट रूप से आपका जेएआर सिस्टम क्लासलोडर द्वारा लोड नहीं किया गया है, इसलिए getSystemResource() काम नहीं कर सकता है। यह काम करना चाहिए:

ClassFromProjectA.class.getClassLoader().getResource("R.txt") 

IMO अधिक सुविधाजनक एक ही पैकेज के अंदर संसाधनों डाल रहा है के रूप में कक्षाएं है कि उन्हें इस्तेमाल करते हैं, तो आप उपयोग कर सकते हैं कम

ClassFromProjectA.class.getResource("R.txt") 

(या, उस वर्ग के अंदर सिर्फ getClass().getResource("R.txt"))

2

क्या ClassLoader.getResource() काम करता है? फिलहाल आप बस निर्दिष्ट कर रहे हैं कि सिस्टम क्लासलोडर का उपयोग किया जाना है।

+0

एक आकर्षण की तरह काम करता है। बस सही क्लासलोडर का उपयोग करना पड़ा :) –