2012-12-26 10 views
6

मैं सोच रहा था कि फ़ाइल संसाधन/हैंडल जारी करने का सबसे अच्छा/उचित तरीका क्या है।I/O संसाधन को ठीक से जारी करना

पारंपरिक कोड,

BufferredInputStream stream = null 
try{ 
    ---- 
    stream = new BufferredInputStream(new FileInputStream()); 
    ---- 
} finally{ 
    if(stream != null){ 
    stream.close() 
    } 

}

फ़ाइल या BufferredInputStream.close अकेले बंद करके जारी किया संभाल लेंगे यह अंतर्निहित stream(i.e. FileInputStream.close()) भी स्पष्ट रूप से कहा जाता है की जरूरत है।

P.S. Javadoc for [FilterOutputStream.close] विधि निर्दिष्ट करती है कि यह स्पष्ट रूप से अंतर्निहित धारा को भी बंद कर देगा। लेकिन अन्य धाराओं में यह दस्तावेज़ में प्रतीत नहीं होता है।

[FilterOutputStream.close]: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterOutputStream.html#close%28%29 

कृपया सलाह दें। अग्रिम में धन्यवाद।

+0

आप केवल BufferredInputStream ऑब्जेक्ट को बंद करके और FileInputStream में हेरफेर करने का प्रयास करके इसे आसानी से जांच सकते हैं और देख सकते हैं कि बंद स्ट्रीम का कोई अपवाद उठाया गया है या नहीं। मेरा मानना ​​है कि यह बंद हो जाएगा जैसा कि आप कई दस्तावेज़ उदाहरणों में देखते हैं, अंतर्निहित धारा गुमनाम रूप से बनाई गई है – giorashc

+0

बस एक सुझाव: यदि आप जेडीके 7 का उपयोग कर रहे हैं, तो संसाधनों के साथ प्रयास करें, यह बहुत आसान है। [यहां] देखें (http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)। –

+0

सुझाव JavaNewbie_M107 के लिए धन्यवाद। जावा 7 अभी तक परियोजना में नहीं जोड़ा गया है। मैं इसके लिए तत्पर हूं –

उत्तर

4

आप सटीक व्यवहार निर्धारित करने के लिए अंतर्निहित कक्षा के लिए हमेशा स्रोत कोड देख सकते हैं।

हालांकि, इस मामले में close()BufferedInputStream पर कॉलिंग अंतर्निहित धारा को बंद कर देगा iee FileInputStream

स्रोत कोड उपलब्ध है here

2

जब कई स्ट्रीमों को बनाए जाने वाले स्ट्रीम को बंद कर दिया गया है, तो अंतर्निहित धारा बंद हो जाएगी। इसलिए, BufferedInputStream बंद करने से अंतर्निहित FileInputStream भी बंद हो जाएगा।

तो आप केवल एक स्ट्रीम पर क्लोज़() को कॉल करते हैं और यह स्वचालित रूप से अंतर्निहित स्ट्रीम को बंद कर देगा।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। जावाडोक का उल्लेख नहीं है। क्या इस उत्तर का समर्थन करने के लिए कोई संदर्भ या सबूत है। फाइल हैंडल लीक को रोकने के लिए एक गंभीर समस्या पर काम कर रहा हूं। –

+0

श्रीमानमान के उत्तर में लिंक देखें। नीचे स्क्रॉल करें और आप देखेंगे कि करीबी() विधि कैसे काम करती है। यह इनपुटस्ट्रीम को बंद कर रहा है जिसे बफरड इनपुटस्ट्रीम के लिए जंजीर किया गया था। –

2

आपका दृष्टिकोण सही है। संदेह में, हमेशा स्रोत कोड की जांच करें। http://www.docjar.com/html/api/java/io/BufferedInputStream.java.html करीबी विधि "इन" बंद कर रही है जिसे बुफर्डइनपुटस्ट्रीम में बंधे हुए थे।

0

BufferredInputStream ही किसी भी सिस्टम संसाधन नहीं रखता है तो BufferredInputStream.close() सरल प्रचार करेंगे पास कॉल यह लपेटता InputStream के लिए .. तो यह ठीक करना चाहिए।

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