2009-12-01 25 views
48

संभव डुप्लिकेट:
Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?क्या मुझे सर्वलेट आउटपुटस्ट्रीम बंद करना चाहिए?

HttpServletResponse.getOutputStream (बंद करने के लिए मैं जिम्मेदार हूँ) (या getWriter() या यहां तक ​​कि InputStream) या मैं करने के लिए इसे छोड़ देना चाहिए कंटेनर?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    OutputStream o = response.getOutputStream(); 
    ... 
    o.close(); //yes/no ? 
} 

उत्तर

59

आपको वास्तव में ऐसा करने की आवश्यकता नहीं है।

अंगूठे नियम: यदि आपने new SomeOutputStream() का उपयोग करके इसे स्वयं नहीं बनाया/खोल दिया है, तो आपको इसे स्वयं बंद करने की आवश्यकता नहीं है। यदि यह उदाहरण के लिए new FileOutputStream("c:/foo.txt") था, तो आपको स्पष्ट रूप से इसे स्वयं बंद करने की आवश्यकता है।

कारण कुछ लोग अभी भी ऐसा करते हैं सुनिश्चित करें कि प्रतिक्रिया शरीर को और कुछ भी नहीं लिखा जाएगा। यदि यह कभी होता है, तो यह ऐप्सरवर लॉग में IllegalStateException का कारण बनता है, लेकिन इससे क्लाइंट को प्रभावित नहीं होगा, इसलिए ग्राहक को अभी भी उचित प्रतिक्रिया मिलती है। अनुरोध-प्रतिक्रिया श्रृंखला में संभावित समस्याओं को जानने के लिए यह एक आसान डीबग भी है जिसे आप पहली नज़र में नहीं देख पाएंगे। उदाहरण के लिए, चेन में कहीं और प्रतिक्रिया प्रतिक्रिया शरीर को और अधिक डेटा जोड़ना है।

स्टार्टर्स के बीच आप जो अन्य कारण देखते हैं वह यह है कि वे को रोकना चाहते हैं कि प्रतिक्रिया डेटा पर अधिक डेटा लिखा गया है। आप अक्सर यह देखते हैं जब जेएसपी प्रतिक्रिया में गलत भूमिका निभाता है। वे लॉग में IllegalStateException एस को अनदेखा करते हैं। कहने की जरूरत नहीं है कि यह विशेष उद्देश्य खराब है।

+1

यदि आप इसे लपेटने के लिए एक और इनपुटस्ट्रीम खोल चुके हैं तो आप स्ट्रीम को बंद करना चाह सकते हैं क्योंकि कंटेनर में रैपिंग स्ट्रीम की दृश्यता नहीं होगी, जिसमें असामान्य बाइट्स हो सकते हैं। आदर्श रूप से आप केवल बुफर्ड स्ट्रीम को स्ट्रीम करते हैं, अगर यह BufferedOutputStream की तरह कुछ है, लेकिन मुझे पता चला कि CipherOutputStream का उपयोग करते समय यह वर्ग पूरी तरह से डेटा नहीं लिखता है (मुझे इस मामले में अच्छे कारण के साथ विश्वास है)। इस स्थिति में ग्राहक को सही प्रतिक्रिया प्राप्त करने के लिए क्लोज़() को कॉल करना आवश्यक था। –

8

नहीं, आपको इसे बंद करने की आवश्यकता नहीं है। यदि आप मूल रूप से ग्राहक को प्रतिक्रिया समाप्त करते हैं। स्ट्रीम बंद करने के बाद आप अगले अनुरोध तक ग्राहक को कुछ भी नहीं भेज सकते हैं। आपने स्ट्रीम नहीं खोली, इसलिए आपको इसे बंद नहीं करना है।

+14

दाएं। एक खेत की तरह: गेट्स को ठीक उसी तरह छोड़ दें जैसा आपने पाया था। – erickson

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