2012-07-13 18 views
5

मैं getResourceAsInputStream के साथ कुछ असाधारण व्यवहार में आया था कि मैं उम्मीद कर रहा था कि कोई व्यक्ति कुछ प्रकाश डालेगा।एक खाली स्ट्रिंग के साथ getResourceAsStream क्यों एक खाली इनपुट स्ट्रीम लौटाता है?

इस विधि को पास करने से एक गैर-संसाधन संसाधन का नाम शून्य हो जाता है, जैसा कि मैं उम्मीद करता हूं। हालांकि, इसे एक खाली या स्थान से भरे स्ट्रिंग को पारित करने से वास्तव में शून्य बाइट्स के साथ एक मान्य इनपुटस्ट्रीम लौटाता है। केवल खाली या अंतरिक्ष से भरे तार ऐसा करने लगते हैं; "\ t" या "\ n" जैसे व्हाइटस्पेस का परिणाम शून्य हो जाएगा।

क्या यह इरादा व्यवहार है? यदि हां, तो इसका उद्देश्य क्या है?

this.class.getResourceAsStream("no_such_resource"); // returns null 
this.class.getResourceAsStream("");     // returns an InputStream 
this.class.getResourceAsStream(" ");    // returns an InputStream 
this.class.getResourceAsStream("\t");    // returns null 

उत्तर

3

getResourceAsStream classloader पथ के लिए एक यूआरएल का निर्माण करने के लिए कहता है। अंत में खाली स्ट्रिंग या रिक्त स्थान वाला पथ उन फ़ाइलों की निर्देशिका को इंगित करता है जहां आपकी कक्षाएं। क्लास फ़ाइल रहता है, इसलिए यह FileURLConnection ऑब्जेक्ट बनाता है। getResourceAsStream बदले में उस वस्तु को getInpuStream() पर पूछता है और कार्यान्वयन एक स्ट्रिंग में एक क्रमबद्ध निर्देशिका सूची बनाता है, इसे डिफ़ॉल्ट लोकेल के अनुसार बाइट्स में परिवर्तित करता है और आपको इन बाइट्स पर ByteArrayInputStream देता है।

FileURLConnections व्यवहार बहुत अच्छी तरह से प्रलेखित नहीं है, लेकिन अपनी खोज करता है, तो ...

+1

ग्रेट स्पष्टीकरण! यह ध्यान देने योग्य है कि यह 'FileURLConnection' का एक प्रश्न है जिसे' JarURLConnection' द्वारा साझा नहीं किया गया है; बिल्कुल एक ही कोड चल रहा है, लेकिन एक जार में पैक कक्षाओं के साथ, एक लिस्टिंग (कम से कम मेरे परीक्षणों के अनुसार) का उत्पादन नहीं करेगा। –

+0

आह, यह समझ में आता है! स्पष्टीकरण के लिए धन्यवाद। –

4

इस कोड का प्रयास करें:

InputStream is = this.class.getResourceAsStream(""); 
BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
String line; 
while((line = br.readLine()) != null) System.out.println(line); 
br.close(); 

यह है कि वर्तमान वर्ग का एक ही निर्देशिका में स्थित हैं कक्षाओं की एक सूची प्रिंट होगा। उदाहरण के लिए:

a.class 
CallablePrintTask.class 
java.policy.applet 
RunnablePrintTask.class 
ZoomableImageFrame.class 
ZoomableImageFrame$FlagHolder.class 
ZoomableImageFrame$ImageViewer.class 
ZoomableImageFrame$LoadAction.class 
ZoomableImageFrame$LoadAction$1.class 
ZoomableImageFrame$ScaleAction.class 
+0

क्या हो रहा है इसका अच्छा उदाहरण। मैं मानता हूं कि परिणाम के बजाय मुझे खाली स्ट्रीम मिल रही थी, इस तरह ग्रोवी कंसोल में मेरी परिकल्पनाओं का परीक्षण करने के लिए कुछ करना है .... –

0

मेरा अनुमान है निम्नलिखित है:

this.class.getResourceAsStream("no_such_resource"); // returns null 
this.class.getResourceAsStream("");     // returns an InputStream 
this.class.getResourceAsStream(" ");    // returns an InputStream 
this.class.getResourceAsStream("\t"); 

getResourceAsStream("c:\t") < - वैध है।

यह संयोग है कि \t एक टैब वर्ण है। फिर भी यह देखने के लिए एक रास्ता के रूप में पूरी तरह से मान्य है।

+0

मुझे ऐसा नहीं लगता है। बैकस्लैश सीमांकित पथ के वैध जावा स्ट्रिंग को बनाने के लिए, आपको बैकस्लाश से बचना होगा। दूसरे शब्दों में, आपको यह 'getResourceAsStream ("c: \\ t") करना होगा। यह बिल्कुल एक टैब चरित्र के समान नहीं है। – Stewart

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