2012-01-20 13 views
5

हाय सब मैं समझता हूं कि अगर हम InputStream से बाइट्स पढ़ते हैं और हमने सभी बाइट्स पढ़ना समाप्त कर दिया है (या हम स्ट्रीम के अंत तक पढ़ने का इरादा नहीं रखते हैं), तो हमें धारा से जुड़े सिस्टम संसाधनों को रिलीज़ करने के लिए close() पर कॉल करना होगा।क्या स्ट्रीम स्वचालित रूप से त्रुटि पर बंद हैं?

अब मैं सोच रहा था कि अगर मैं read बाइट्स और यह एक java.io.IOException फेंकता है, मैं अभी भी धारा के साथ जुड़े सिस्टम संसाधन जारी करने के लिए close() फोन करने के लिए आवश्यक कर रहा हूँ?

या यह सच है कि त्रुटियों पर, स्ट्रीम स्वचालित रूप से बंद हो जाती हैं इसलिए हमें close() पर कॉल करने की आवश्यकता नहीं है?

+0

संसाधन जब GCed बंद हो जाती हैं। तो आपको एक ऐसी समस्या हो सकती है जो शायद ही कभी अपवाद कार्य को ठीक करे। निर्धारिती संसाधन प्रबंधन के लिए, बंद() हमेशा कहा जाना चाहिए। –

+0

@ पीटर Lawrey क्या आप कह रहे हैं कि यह ** है क्योंकि ** जीसी चुपचाप 'बंद() 'द्वारा फेंक दिया IOException खाती है कि हमें' करीबी() 'स्वयं को कॉल करना चाहिए? तो अगर (hypothetically) बंद इंटरफ़ेस का इंटरफ़ेस किसी भी प्रकार का अपवाद नहीं फेंकता है, तो हमें स्ट्रीम में त्रुटि होने पर बंद() को कॉल करने की आवश्यकता नहीं है? – Pacerier

+0

यह विचार करने के लिए कुछ है, हालांकि निकट() द्वारा फेंक दिए गए किसी अपवाद को अनदेखा करने के लिए इसकी सुंदर सामान्य प्रथा है। जीसी को देने के साथ समस्या यह है कि आप इन संसाधनों को साफ करने वाले जीसी को ट्रिगर करने से पहले हमारे फाइल हैंडल चला सकते हैं। आपका प्रोग्राम काम पर दिखाई दे सकता है, लेकिन कभी-कभी असफल हो जाता है जो आप बचाना चाहते हैं। –

उत्तर

6

ओएस स्वयं धाराओं को बंद कर सकता है और संसाधनों को रद्द कर सकता है क्योंकि प्रक्रिया (अर्थात्, जेवीएम) समाप्त हो जाती है, लेकिन ऐसा करने के लिए अनिवार्य नहीं है।

आपको हमेशा finally ब्लॉक को कार्यान्वित करना चाहिए जहां आप इसे इस तरह के मामलों में बंद करते हैं, उदा। इस तरह:

InputStream is = null; 

try { 
    is = new FileInputStream(new File("lolwtf")); 
    //read stuff here 
} catch (IOException e) { 
    System.out.println("omfg, it didn't work"); 
} finally { 
    is.close(); 
} 

यह वास्तव में अगर यह पहली जगह में फेंक दिया काम करने के लिए गारंटी नहीं है, लेकिन आप शायद वैसे भी उस बिंदु पर समाप्त करना चाहते हैं के बाद से आपके डेटा स्रोत शायद किसी तरह से में गड़बड़ है या नहीं। यदि आप InputStream के प्रदाता को चारों ओर रखते हैं, तो आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं, जैसे कि अगर मैंने File ऑब्जेक्ट को मेरे उदाहरण में चारों ओर एक रेफरी रखा है, तो मैं यह जांच सकता हूं कि यह File के इंटरफ़ेस के माध्यम से मौजूद है या नहीं, लेकिन यह विशिष्ट है आपके विशेष डेटा प्रदाता के लिए।

इस रणनीति नेटवर्क सत्र कि फेंक, उदाहरण के लिए, हाइबरनेट साथ साथ और अधिक उपयोगी हो जाता है ...

+0

अंतिम अनुच्छेद से आपका क्या मतलब है? क्या आपका मतलब है * अंततः ब्लॉक को कार्यान्वित करना * * की रणनीति? – Pacerier

+0

@Pacerier मतलब यह है कि यह रखना आम है, उदाहरण के लिए, अंत में ब्लॉक में एक हाइबरनेट सत्र का समापन। – TC1

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