2011-02-05 20 views
12

टेक्स्ट फ़ाइल से पढ़ते समय, आम तौर पर FileReader बनाता है और फिर BufferedReader में घोंसला बनाता है। जब मैं पढ़ रहा हूं तो मुझे किस दो पाठकों को बंद करना चाहिए? फर्क पड़ता है क्या?क्लोजिंग नेस्टेड रीडर

FileReader fr = null; 
BufferedReader br = null; 
try 
{ 
    fr = new FileReader(fileName); 
    br = new BufferedReader(fr); 
    // ... 
} 
finally 
{ 
    // should I close fr or br here? 
} 

अपवाद-सुरक्षा की बात आती है जब मैं थोड़ा उलझन में हूं। क्या होता है जब BufferedReader कन्स्ट्रक्टर अपवाद फेंकता है? क्या यह नेस्टेड पाठक बंद करता है? या यह फेंकने की गारंटी नहीं है?

उत्तर

9

आम तौर पर, बाहरी स्ट्रीम रैपर पर close() लपेटा हुआ धाराओं पर close() पर कॉल करेगा। हालांकि, अगर आपको लगता है कि एक निर्माता एक अपवाद फेंक देगा, तो Closeable इंटरफ़ेस का उदार उपयोग करें।

FileReader fr = new FileReader(fileName); 
Closeable res = fr; 
try { 
    BufferedReader br = new BufferedReader(fr); 
    res = br; 
} finally { 
    res.close(); 
} 

तो, भले ही JVM बफर के लिए ढेर स्थान से बाहर भाग गया और एक त्रुटि फेंक दिया, आप एक फ़ाइल हैंडल रिसाव नहीं होगा।

try (FileReader fr = new FileReader(fileName); 
    BufferedReader br = new BufferedReader(fr)) { 
    // do work 
} 
+1

+1। मेरे समाधान से ज्यादा सुरुचिपूर्ण। –

+0

अच्छा समाधान यदि आप कई संभवतः अपवाद-फेंकने वाले रैपर (और इसी तरह) के साथ काम कर रहे हैं। बेशक, आप यह देखने के लिए कि 'cufor में अपवाद का कोई मौका है या नहीं,' BufferedReader' के दस्तावेज़ और कोड को देख सकता है। – fwielstra

0

केवल BufferedReader बंद करना पर्याप्त है, क्योंकि यह FileReader को लपेटता है। यदि आप source codeBufferedReader पर देखते हैं तो आप देखेंगे कि close विधि, लपेटा हुआ स्ट्रीम बंद कर देता है।

+0

'buf = new char [8192]; 'ईडब्ल्यू, जादू संख्या! – fredoverflow

0

अंततः ब्लॉक में BufferedReader को बंद करें।

0

आप BufferedReader के करीबी विधि कॉल करते हैं, तो BufferedReader FileReader के करीबी विधि कॉल करेगा:

जावा 7 के लिए और उपयोग ऊपर की कोशिश-साथ-संसाधनों

। इस प्रकार दोनों करीबी विधि को बुलाया जाता है। अधिक सटीक BufferedReader कुछ भी नहीं करेगा लेकिन FileReader की करीबी विधि को कॉल करना। इस प्रकार इससे कोई फर्क नहीं पड़ता। हालांकि मुझे लगता है कि यह अच्छा अभ्यास है, बुफर्ड रीडर की करीबी विधि को भी बुलाओ।

0

कुछ भी फेंकने की गारंटी नहीं है। चूंकि बफर आवंटित किया जाता है क्योंकि यह OutOfMemoryError फेंक सकता है। मैं आमतौर पर अपने कोड को दो वर्गों में अलग करता हूं: संसाधन प्राप्त करता हूं और फिर संसाधनों का उपयोग करता हूं। चुपचाप ढीला लंबी चलने वाली सर्वर अनुप्रयोग में एक फ़ाइल हैंडलर से लायक कोई बात नहीं है

// Acquire resources section. 

final FileReader fr = new FileReader(fileName); 

BufferedReader br = null; 

try 
{ 
    br = new BufferedReader(fr); 
} 
finally 
{ 
    if (br == null) 
    { 
     // Note that you are closing the fr here 
     fr.close(); 
    } 
} 

// Use resources section 
try 
{ 
    // ... use br 
} 
finally 
{ 
    // Now that br is safely constructed, just all its close 
    br.close(); 
} 

और मैं आपसे सहमत हूँ,: प्रत्येक खंड आमतौर पर अद्वितीय सफाई की जरूरत है

यहाँ वर्णन करने के लिए कोड है।

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