2011-09-30 10 views
9

इस कोड को देखते हुए:।अंतर getResourceAsStream()

/* 1 */ InputStream in1 = ClassLoader.getSystemResourceAsStream("foobar.txt"); 
/* 2 */ InputStream in2 = this.getClass().getResourceAsStream("/foobar.txt"); 

दोनों एक ही संसाधन वापसी करते हैं (मुझे लगता है कि इस सवाल का जवाब है "हाँ")?

क्या वे दोनों "समान" कक्षापथ तक पहुंचते हैं? # 1 में विधि का नाम क्यों है सिस्टम संसाधन एएसस्ट्रीम ", लेकिन # 2 के लिए यह सिर्फ" getResourceAsStream "है?

धन्यवाद

उत्तर

7

जावाडोक

पढ़ने के लिए ओपन के अनुसार, खोज पथ से निर्दिष्ट नाम के एक संसाधन वर्गों लोड करने के लिए इस्तेमाल किया। यह विधि सिस्टम क्लास लोडर के माध्यम से संसाधन को रेखांकित करती है (getSystemClassLoader() देखें)।

this लोड करने के लिए उपयोग किया जाने वाला क्लासलोडर आवश्यक नहीं है सिस्टम क्लासलोडर। एक साधारण डेस्कटॉप ऐप में, यह शायद सच होगा। लेकिन वेबपैप्स - अन्य चीजों के साथ - आम तौर पर अधिक जटिल क्लासपाथ पदानुक्रम होते हैं और इसलिए यह वही नहीं होगा। एक जटिल कक्षा में, इसलिए जो भी लौटाया जाता है, वह भी इस बात पर निर्भर करेगा कि 'foobar.txt' की कितनी प्रतियां आपके कक्षा के चारों ओर तैर रही हैं।

संक्षिप्त उत्तर यह है कि आप यह नहीं मान सकते कि वे एक ही संसाधन के लिए एक स्ट्रीम वापस कर देंगे।

+0

तो आप कह रहे हैं कि वेब अनुप्रयोगों में एकाधिक क्लासपाथ हैं? – Michael

+0

@ माइकल - का क्रमबद्ध करें। आम तौर पर, प्रत्येक वेबपैप को अपना खुद का क्लासलोडर मिलता है जो युद्ध, ईएआर, आदि की सामग्री के लिए ज़िम्मेदार है। इन क्लासलोडर्स के पास एक सामान्य माता-पिता होता है और इसलिए विभिन्न libapps में सामान्य lib निर्देशिकाओं में कक्षाएं साझा की जाती हैं। लेकिन ये पदानुक्रम कई लोडर गहरे हो सकते हैं। सिस्टम क्लासलोडर शीर्ष पर होगा, लेकिन शायद इसमें एक संख्या हो सकती है। – sblundy

+0

अलग-अलग वेबपैप्स में अलग-अलग क्लासलोडर्स होंगे। उदाहरण के लिए, ग्लासफ़िश में, उनके पास यहां एक पदानुक्रम निर्दिष्ट है: http://download.oracle.com/docs/cd/E19798-01/821-1752/6nmndgmhr/index.html#fvxzq। – g051051

11

मुख्य अंतर वर्ग लोडर है।

निम्नलिखित दोनों कथनों बिल्कुल वैसा ही व्यवहार करते हैं या नहीं है कि क्या, यह एक classloader द्वारा getClass()
this.getClass().getResourceAsStream("/foobar.txt");

दूसरे शब्दों में लौटे का उपयोग करता है प्रणाली classloader
ClassLoader.getSystemResourceAsStream("foobar.txt");

का उपयोग करता है, पर निर्भर करता है आवेदन क्लासलोडर। एक साधारण आवेदन के लिए, दोनों एक ही क्लासलोडर का संदर्भ लें। हालांकि, अधिकांश अनुप्रयोगों के लिए (जैसे वेब अनुप्रयोग Servlet कंटेनर के भीतर चल रहा है), यह मामला नहीं होगा।

सामान्य रूप से, मैं कहूंगा कि getClass()। GetResourceAsStream() बेहतर विकल्प होगा क्योंकि यह उसी क्लासलोडर का उपयोग क्लास कोड के वर्ग के रूप में करेगा।

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