2009-07-13 16 views
11

के साथ फ़ाइलों को लोड करना यह समस्या मुझे थोड़ी देर के लिए परेशान कर रही है। मैं अपने जावा अनुप्रयोग में एक जोड़े फ़ाइलें लोड करने के लिए है, और एक ही रास्ता मैं अब तक काम कर गया इस तरह दिखता है:क्लासलोडर

URL hsURL; 
if(System.getProperty("os.name").toLowerCase().contains("windows")) { 
    hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs"); 
} 
else { 
    hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs"); 
} 

लेकिन यह बदसूरत और भयानक है। थोड़ी देर के लिए मैंने सोचा कि मैं इस काम के लिए किया था:।

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs"); 

लेकिन वह नहीं रह गया है किसी कारण (मैं कुछ बदल दिया है चाहिए और नहीं देखा के लिए काम करता है यह NULL भेजता है

मैं getResource() का उपयोग किया जाना चाहिए। getSystemResource() प्राप्त करने के बजाय (यदि हां, तो सिस्टम सिस्टम संसाधन() स्थिर क्यों है लेकिन प्राप्त नहीं है संसाधन())

मैं ग्रहण का उपयोग कर रहा हूं और मैंने बिल्ड पथ (क्लासपाथ) में फ़ोल्डर को शामिल करने का प्रयास किया है और इसमें शामिल नहीं है कोई फर्क नहीं पड़ता।

उत्तर

23

getSystemResource स्थिर है क्योंकि यह सिस्टम क्लासलोडर का उपयोग करेगा, जो स्थिर रूप से उपलब्ध है। (ClassLoader.getSystemClassLoader)

यदि आपका संसाधन क्लासपाथ में उपलब्ध है, तो मैं उचित कक्षा से ClassLoader.getResource() या Class.getResource का उपयोग करने का सुझाव दूंगा, उदाहरण के लिए

Foo.class.getResource("/helpsets/helpset.hs"); 

(ClassLoader.getResource "पूर्ण" है,। Class.getResource वर्ग के पैकेज के सापेक्ष है जब तक आप इसे के साथ एक '/' उपसर्ग)

अगर यह काम नहीं मिलता है तो कृपया पोस्ट अपने ऐप क्लासपाथ के संदर्भ में कॉन्फ़िगर किया गया है, और आपकी फ़ाइल कहां है।

संपादित करें: मैं आमतौर पर URL किसी InputStream की तुलना में कम उपयोगी पाते हैं, तो मैं getResourceAsStream बजाय getResource का उपयोग करें। वाईएमएमवी

+0

डारन।मुझे कुछ सेकंड्स द्वारा मारो – tddmonkey

+0

यदि आप केवल सामग्री में रुचि रखते हैं, तो आप शायद क्लासलोडर –

+0

पर getResourceAsStream() का उपयोग करके बेहतर तरीके से बंद हो जाएं, मुझे अभी तक यह काम नहीं मिला है। मैं एक फ़ाइल को लोड करने की कोशिश कर रहा हूं जो एक अलग पैकेज में है क्योंकि जिस वर्ग से मैं इसे लोड कर रहा हूं, इसलिए मुझे किसी प्रकार का पूर्ण संदर्भ चाहिए। – twolfe18

3

आपने यहां कई अलग-अलग चीजों का उल्लेख किया है, तो चलिए उन्हें सॉर्ट करें।

1) एक "फ़ाइल:" बनाना यूआरएल "user.dir" पर आधारित

"user.dir" संपत्ति वर्तमान कार्यशील निर्देशिका को संदर्भित करता है - जहाँ भी उपयोगकर्ता गया हो सकता है जब s/वह शुरू कर दिया अप्प। संभावनाएं अच्छी हैं कि यहां लिखी गई फाइलें दो रनों के बीच गायब हो जाएंगी (क्योंकि उपयोगकर्ता एक अलग निर्देशिका से चल सकता है)।

"user.home" संपत्ति उपयोगकर्ता की होम निर्देशिका को संदर्भित करती है - जो रनों के बीच समान रहनी चाहिए।

किसी भी मामले में, फ़ाइलों को खोलने के लिए फ़ाइल ऑब्जेक्ट का उपयोग करें, "फ़ाइल:" यूआरएल बनाने के साथ चारों ओर मत बनो। आपको कोई लाभ नहीं मिलता है, और जैसा कि आप देख सकते हैं, आपको इसे एक्सेस करने के लिए गन्दा कोड लिखना होगा।

2) classloader

यह फ़ाइलों को अपने आवेदन के साथ पैक कर रहे हैं पुनः प्राप्त करने के लिए है के माध्यम से एक संसाधन प्राप्त कर रहा है - केवल पढ़ने के लिए फ़ाइलें। जैसा कि आपने देखा है, कई प्रकार हैं। मैं निम्नलिखित का उपयोग करना पसंद करता हूं, क्योंकि मुझे लगता है कि एक वर्ग उस फ़ाइल को लोड करना चाहेंगे जो इसके साथ पैक किया गया है।

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName); 
संबंधित मुद्दे