2009-11-27 8 views
16

मुझे कुछ उत्पादन कोड मिला है जो कुछ ऐसा करता है:HttpServletRequest से लौटाई गई इनपुट स्ट्रीम को बंद करना आवश्यक है?

HttpServletRequest httpServletRequest 
... 
DataInputStream dis = new DataInputStream(httpServletRequest.getInputStream()) 

ये धाराएं स्पष्ट रूप से कभी बंद नहीं होती हैं। मैं यहां मान रहा हूं कि सर्वलेट कंटेनर इसका प्रबंधन करता है (जेबीएसएस वेब)। इसे संभालने का सही तरीका क्या है?

+0

प्रतिक्रिया लोगों के लिए धन्यवाद। मैंने मूल रूप से इस सवाल से पूछा क्योंकि मैं जेबॉस वेब 2.1.2 (जेबॉस 5.0.1 में) के साथ एक समस्या में भाग रहा था। ChunkedInputFilter चंकित स्थानांतरण-एन्कोडिंग संसाधित करते समय हमेशा के लिए लूप कर सकते हैं। मैंने सोचा कि यह मेरा कोड था। जेबॉस वेब 2.1.3 में इसके लिए एक फिक्स है। – Conor

उत्तर

25

आई/ओ में अंगूठे का नियम, अगर आप नहीं खुला था/InputStream स्रोत बनाने खुद, तो आपको इसे बंद करने की आवश्यकता नहीं है। यहां आप अनुरोध के इनपुटस्ट्रीम को लपेट रहे हैं, इसलिए आपको इसे बंद करने की आवश्यकता नहीं है।

यदि आपने इनपुट को स्वयं खोल दिया है उदा। new FileInputStream("c:/file.ext") तो आपको अंततः अंत में ब्लॉक में इसे बंद करने की आवश्यकता है। कंटेनर को हुड के नीचे ऐसा करना चाहिए।

+0

यदि आप जिस विधि को कॉल कर रहे हैं, वह java.net.URL से 'ओपनस्ट्रीम' जैसे 'ओपन' के साथ शुरू होता है, तो क्या इसका मतलब है कि आपने इसे स्वयं खोला है और इसे बंद करने की आवश्यकता है? –

+1

मुझे लगता है कि एक अपवाद यह है कि यदि आपके द्वारा खोला गया नया स्ट्रीम सिर्फ एक रैपर है: 'नया BufferedInputStream (inputStream)' तो आपको इसे बंद करने की आवश्यकता नहीं हो सकती है क्योंकि इसे किसी भी व्यक्ति द्वारा 'इनपुटस्ट्रीम' खोला जाना चाहिए? – gerrytan

+0

मुझे लगता है कि हमारे पास 'URLConnection getInputStream()' और 'getOutputStream()' ऑरैकल दस्तावेज़ों के राज्यों के रूप में अपवाद है [(ओरेकल डॉक)] (http://docs.oracle.com/javase/tutorial/networking/urls/ readWriting.html) धारा पूरी तरह से खोला प्रतीत होता है। इसके अलावा यह [स्टैक ओवरफ्लो पोस्ट] (http://stackoverflow.com/questions/4844535/why-do-you-have-to-call-urlconnectiongetinputstream-to-be-able-to-write-out-to) वर्णन करता है कि आप स्ट्रीम को बंद करना होगा, जिसे आपने अभी भी 'प्राप्त करें ... स्ट्रीम() ' – tObi

3

कंटेनर इसे संभालेगा। यह उसी स्थान पर संसाधन को बंद करने के लिए हमेशा अच्छी कोडिंग शैली होती है जिसे आपने आवंटित किया था। (मैं गलत है कि मेरी मूल पोस्ट में। मैंने सोचा पर आप धारा खोला था। ध्यान से अधिक पढ़ना चाहिए।)

8

आपको बिल्कुल इन धाराओं को बंद करना चाहिए, जो कि कंटेनर का काम है। ऐसा करने से मैन्युअल रूप से अनुरोध जीवन चक्र में हस्तक्षेप होता है, और कुछ कंटेनर आपसे ऐसा करने के लिए हिंसक रूप से ऑब्जेक्ट कर सकते हैं।

0

विनिर्देश (3.0 उम्मीदवार तक) नहीं कहता है (जहां तक ​​मैं कह सकता हूं)। कैननिकल सूचना की अनुपस्थिति में, आप कार्यान्वयन की दया पर हो सकते हैं।

संदर्भ कार्यान्वयन के लिए स्रोत कोड Sun Servlet page पर उल्लेख किया गया है:

संदर्भ कार्यान्वयन जावा EE 5 SDK में और भी खुला स्रोत जावा प्लेटफ़ार्म, एंटरप्राइज संस्करण (जावा EE) में शामिल है जावा सर्वर पर ग्लासफ़िश प्रोजेक्ट के माध्यम से उपलब्ध एप्लिकेशन सर्वर। सर्वलेट प्रौद्योगिकी के लिए संदर्भ कार्यान्वयन स्रोत कोड java.net पर svn भंडार से उपलब्ध है। ग्लासफ़िश में सभी वेबटेयर प्रौद्योगिकियों पर अतिरिक्त जानकारी ग्लासफ़िश वेबटियर पृष्ठ पर मिल सकती है।

व्यवहार की जांच करना आपके द्वारा प्राप्त होने वाले एक निश्चित उत्तर के करीब हो सकता है।

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