2009-09-25 9 views
12

मैं की तरह कुछ करना कहते हैं:जावा: Reader.close() किसी भी जंजीर पाठकों को बंद करता है?

Reader r = new BufferedReader(new FileReader(file)); 

... read ... 

r.close() 

इस पास अंतर्निहित FileReader (और जारी खुली हुई फ़ाइल हैंडल) करता है?

-डेव

+0

बेशक अगर 'बुफर्ड रीडर' कन्स्ट्रक्टर फेंकता है, तो आप अंतर्निहित 'फ़ाइल रीडर' को बंद करने में सक्षम नहीं होंगे (जिसे आप किसी भी तरह से वर्णमाला निर्दिष्ट नहीं कर सकते हैं, इसलिए थोड़ा निराशाजनक है)। –

उत्तर

17

हाँ, सबसे बाहरी Reader पर close बुला पर्याप्त होने जा रहा है

Sun Developer Network पर Java I/O Streams लेख श्रृंखलन स्ट्रीम पर एक अनुभाग जो निम्नलिखित का कहना है:।

FileOutputStream fos = new FileOutputStream("myfile.out"); 
CryptOutputStream cos = new CryptOutputStream(fos); 
GZIPOutputStream gos = new GZIPOutputStream(cos); 

[...]

[...] जब बंद करने श्रृंखलित स्ट्रीम, आपको केवल बाहरी स्ट्रीम स्ट्रीम को बंद करने की आवश्यकता है क्योंकि close() कॉल सभी शापित वर्गों के माध्यम से स्वचालित रूप से ट्रिक हो जाती है; में उपरोक्त उदाहरण, आप विधि GZIPOutputStream कक्षा पर कॉल करेंगे।

इसलिए, इस मामले में, एक ही BufferedReader पर close फोन करना होगा।

dtsazza already mentioned के रूप में, Java API SpecificationBufferedReader वर्ग के लिए कहते हैं BufferedReader.close विधि किसी भी अंतर्निहित संसाधनों मुक्त होगा कि:

धारा और विज्ञप्ति किसी भी प्रणाली के साथ जुड़े संसाधनों बंद करता है। [...]

तो, कोई भी अंतर्निहित Reader एस का अनुमान लगा सकता है, भले ही यह स्पष्ट रूप से ऐसा न कहें।

+1

सच (मॉड्यूलो [बग] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6266377)) लेकिन विचार करें: http://stackoverflow.com/a/3629116/281545। तो अगर आपके उदाहरण में 'CryptOutputStream' ने' IOException 'फेंक दिया है तो क्या कॉलर को' fos' बंद करना चाहिए? –

0

हां। ऐसा होता है। सॉकेट के लिए इसका इस्तेमाल करते समय मुझे यह पता चला।

My Question

मूल रूप से आप इसे बंद नहीं कर सकते जब तक आप माता पिता के साथ किया जाता है। सॉकेट के मामले में यह वास्तव में आपकी सॉकेट बंद कर देगा। :-(

4

the documentation के अनुसार, यह केवल "पाठक] से जुड़े किसी भी सिस्टम संसाधन को जारी करता है"। चाहे कोई रीडर किसी नेस्टेड पाठकों को बंद कर देता है, वह विशिष्ट वर्ग के कार्यान्वयन का विषय है।

आपके द्वारा उल्लिखित विशिष्ट उदाहरण में - हाँ, BufferedReader हमेशा घोंसला वाले पाठक को बंद कर देगा। लेकिन जब इस आमतौर पर होता है, इसका यह मतलब नहीं है कि सभी नेस्टेड पाठक किसी प्रकार का है कि Reader इंटरफ़ेस के कार्यान्वयन उन्हें के माध्यम से एक close() कॉल का प्रचार करेंगे - आप उस विशिष्ट के प्रलेखन जांच करने की आवश्यकता होगी पता लगाने के लिए कक्षा।

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