2009-09-07 12 views
152

मैं एक स्थानीय एक BufferedReader एक FileReader के चारों ओर लिपटा का उपयोग कर फ़ाइल पढ़ रहा हूँ:क्या मुझे FileReader और BufferedReader दोनों को बंद करने की आवश्यकता है?

BufferedReader reader = new BufferedReader(new FileReader(fileName)); 
// read the file 
// (error handling snipped) 
reader.close(); 

मैं FileReaderclose() करने की ज़रूरत है, या आवरण कि संभाल लेंगे? मैं कोड को देखा है, जहां लोगों को कुछ इस तरह करते हैं:

FileReader fReader = new FileReader(fileName); 
BufferedReader bReader = new BufferedReader(fReader); 
// read the file 
// (error handling snipped) 
bReader.close(); 
fReader.close(); 

इस विधि एक सर्वलेट से कहा जाता है, और मुझे यकीन है कि मैं किसी भी हैंडल खुला छोड़ नहीं करना चाहते हैं।

+4

यक़ीन, आप इस तरह की जानकारी के लिए स्रोत पढ़ सकते हैं। यह जेडीके स्थापना निर्देशिका में src.zip में है, या आप इसे ऑनलाइन पढ़ सकते हैं उदाहरण के लिए http://www.docjar.com/html/api/java/io/BufferedReader.java.html – gustafc

+36

किसी को पढ़ने के लिए कह रहा है स्रोत "आरटीएफएम!" कहने से भी बदतर है। और क्या होगा यदि स्रोत में एक बग है; निस्संदेह हम जानना चाहते हैं कि * सही * व्यवहार क्या है? – Raedwald

+1

खैर ... इस बिंदु से: एपीआई चश्मा को इंगित करना तब बेहतर नहीं है। अगर स्रोत में कोई बग नहीं है जिसके कारण यह व्यवहार नहीं करता है तो यह दस्तावेज़ों में निर्दिष्ट है, आप दस्तावेज़ों पर भरोसा नहीं कर सकते हैं। तो ऐसे प्रश्न का उत्तर देने का कोई अच्छा तरीका नहीं है। संक्षेप और स्पष्टता के संयोजन के लिए – Atmocreations

उत्तर

179

संख्या।

BufferedReader.close() 

BufferedReader और InputStreamReader

के साथ-साथ

FileReader.close() 

करता है के लिए जावाडोक के अनुसार धारा बंद कर देता है।

+7

+1। – CPerkins

+11

जब तक 'BufferedReader' के निर्माता को अपवाद नहीं फेंकता है। अंतर्निहित धारा को बंद करने के लिए यह क्लीनर है, हालांकि आपको अन्य संसाधनों और बफरिंग के साथ सजावटी के लिए बाहर देखने की आवश्यकता है। –

+6

जावाडोक यह नहीं कहता कि 'BufferedReader.close()' अंतर्निहित पाठक को बंद करता है या नहीं। इसका विवरण बस 'Reader.close() 'से कॉपी किया गया है। यह अभ्यास में वास्तविक व्यवहार हो सकता है, लेकिन यह दस्तावेज नहीं है। –

6

BufferedReader स्रोत के अनुसार, इस मामले में bReader.close कॉल fReader.close तकनीकी रूप से आपको बाद वाले को कॉल करने की आवश्यकता नहीं है।

4

BufferedReader के लिए स्रोत कोड दिखाता है कि जब आप BufferedReader को बंद करते हैं तो अंतर्निहित बंद होता है।

+0

मैं वास्तव में कुछ ठोस को जोड़ने के लिए इसे एक अंगूठे देना चाहता हूं, लेकिन यह केवल ओपनजेडीके कार्यान्वयन को संदर्भित करता है, और चूंकि जावा डॉक्स 'रीडर # क्लोज़()' के लिए अस्पष्ट हैं, इसलिए यह ठोस सबूत प्रदान नहीं करता है कि ओरेकल जेडीके उदाहरण के लिए, एक समान फैशन में लागू किया गया है। – searchengine27

83

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

BufferedReader reader = new BufferedReader(new FileReader(fileName)); 

वहाँ एक बहुत ही पतली मौका है कि यह एक फ़ाइल हैंडल रिसाव सकता है कि यदि BufferedReader निर्माता (जैसे OutOfMemoryError) एक अपवाद फेंक दिया है। यदि आपका ऐप इस स्थिति में है, तो आपकी सफाई की कितनी सावधानी बरतनी चाहिए इस पर निर्भर करता है कि आप संसाधनों के ओएस को वंचित नहीं करते हैं, जो अन्य कार्यक्रमों को आवंटित करना चाहते हैं।

try (Reader reader = new FileReader(fileName); 
    BufferedReader buffered = new BufferedReader(reader)) { 
    // TODO: input 
} 
:

Reader reader = new FileReader(fileName); 
Closeable resource = reader; 
try { 
    BufferedReader buffered = new BufferedReader(reader); 
    resource = buffered; 
    // TODO: input 
} finally { 
    resource.close(); 
} 

जावा 7 कोड कोशिश के साथ-संसाधनों पैटर्न का उपयोग करना चाहिए:

Closeable इंटरफ़ेस अगर एक आवरण निर्माता जावा 5 या 6 में असफल हो जाने की संभावना है इस्तेमाल किया जा सकता

+3

धन्यवाद, वह बहुत प्रबुद्ध था। – Zilk

+0

एक ही नस में: http://stackoverflow.com/a/2732760/281545 –

0

आपको केवल bufferedReader यानी reader.close() को बंद करने की आवश्यकता है और यह ठीक काम करेगा।

3

स्रोत कोड की जाँच के बाद, मैंने पाया कि उदाहरण के लिए:

FileReader fReader = new FileReader(fileName); 
BufferedReader bReader = new BufferedReader(fReader); 

पास() BufferedReader पर विधि वस्तु रीडर वर्ग की विधि सार पास() कहेंगे जो अंततः होगा लागू विधि को इनपुटप्रीम रीडर कक्षा में कॉल करें, जो इनपुटस्ट्रीम ऑब्जेक्ट को बंद करता है।

तो, केवल bReader.close() पर्याप्त है।

+1

स्रोत कोड शो क्या संदर्भ के रूप में उपयोग योग्य नहीं है। यह * विनिर्देश * कहता है, इस मामले में जावाडोक, जिस पर भरोसा किया जा सकता है। – EJP

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