2011-02-23 10 views
20

मैं टेस्ट ऑटोमेशन में प्रशिक्षु के रूप में काम कर रहा हूं। मैं ग्रहण के साथ जुनीट कोड बनाने और ग्रहण का उपयोग करके चलाने के साथ काम कर रहा हूं। उसमें मैं FileInputStream फ़ंक्शन का उपयोग करके एक्सेल शीट से डेटा को पुनर्प्राप्त कर रहा हूं।क्या मुझे FileInputStream बंद करना है?

FileInputStream fi=new FileInputStream("c:\\search.xls"); 
Workbook w=Workbook.getWorkbook(fi); 
Sheet s=w.getSheet(0); 

क्या इनपुटस्ट्रीम फ़ंक्शन को बंद करना आवश्यक है? यदि ऐसा है तो कृपया मुझे कुछ कोडिंग के साथ मार्गदर्शन करें।

उत्तर

22

हां, यदि आप अपने सिस्टम संसाधनों को वापस छोड़ना चाहते हैं तो आपको close इनपुटस्ट्रीम की आवश्यकता है।

FileInputStream.close() आपको जो चाहिए वह है।

7
FileInputStream fi=null; 
try { 
    fi=new FileInputStream("c:\\search.xls"); 
    Workbook w=Workbook.getWorkbook(fi); 
    Sheet s=w.getSheet(0); 
} finally { 
    if (fi!=null) { 
     fi.close(); 
    } 
} 
+4

बस एक छोटी सी टिप्पणी - आपको 'क्लोज़() 'कथन के साथ' क्लोज़()' स्टेटमेंट को 'क्लोज़() 'के रूप में चेक किए गए IOException को फेंकने की घोषणा करने की आवश्यकता है। वास्तव में, आप अंततः इस तरह का उपयोग नहीं कर सकते हैं। आप केवल रनटाइम अपवादों के साथ प्रयास/अंत कर सकते हैं। लेकिन IOException और उप-वर्गों जैसे चेक अपवादों के साथ, आपको एक कोशिश/पकड़ या कोशिश/पकड़/आखिरकार होना चाहिए ... यह केवल कोशिश/आखिरकार संकलित नहीं होगा। –

+2

निर्भर करता है कि विधि के लिए IOException घोषित किया गया है या नहीं। यदि आप इसे पकड़ते हैं, तो आपको पता होना चाहिए कि इसके साथ क्या करना है। महत्वपूर्ण हिस्सा अंत में ब्लॉक में बंद() डाल रहा है। वास्तव में इसका स्वचालित संचालन उन सुविधाओं में से एक है जिन्हें मैं वास्तव में जावा 7 में देखने के लिए उत्सुक हूं। – Axel

6

आपको या तो अपने प्रोग्राम को बंद करने(), या समाप्त करने की आवश्यकता है।

हालांकि आप भ्रमित मुद्दों में चला सकते हैं अगर आप

  • कभी कभी परीक्षण के रूप में फ़ाइल को बंद नहीं है व्यक्तिगत रूप से चलाए जा रहे हैं या परीक्षण के एक समूह एक ही प्रक्रिया में चलाए जा रहे हैं। (तो आप एक परीक्षण कर सकते हैं जो एक तरफ काम करता है लेकिन दूसरे नहीं)
  • आप एक खुली फ़ाइल का नाम बदल या हटा नहीं सकते हैं।

अपने संसाधनों को हमेशा बंद करने का सबसे अच्छा अभ्यास है जो आप उनके साथ समाप्त कर चुके हैं, हालांकि मुझे यूनिट परीक्षण स्क्रिप्ट के रूप में देखते हैं जिन्हें हमेशा सर्वोत्तम अभ्यास का पालन नहीं करना पड़ता है।

-1

बेसिक कॉम्पसी 101 हमें जावा या किसी भी भाषा में खोलने वाले संसाधनों को बंद करने के लिए सुनिश्चित करने के लिए कहता है। तो हाँ, आपको उन्हें बंद करने की जरूरत है। बुरा जुजू तब होता है जब आप ऐसा नहीं करते हैं।

इसके अलावा, आपको जवाडॉक्स का उपयोग करने के लिए सीखना चाहिए (और झुकाव)। FileInputStream और Closeable के लिए जावाडोक पर देखें। जवाब वहाँ हैं।

+2

आलोचना के बिना स्थापित नियमों का पालन करने और * क्यों? * भाग को समझने के लिए यह वास्तव में भयानक दृष्टिकोण है। * बुरी चीजें होती हैं * - ओह आम ?! प्रोग्रामिंग एक वूडू जादू नहीं है, परिणामों का जिक्र किए बिना (** फ़ाइल को स्थानांतरित नहीं किया जा सकता है, सामान्य रूप से, मेमोरी लीक पेश किए जा सकते हैं, [फाइल हैंडल के ओएस पूल को समाप्त किया जा सकता है] (https://stackoverflow.com/questions/ 1661322/बहुत-खुले-फ़ाइल-हैंडल) **) सही तरीके से मुक्त संसाधनों का नहीं, आपका जवाब बेकार है और इसके अलावा हानिकारक है। ** डाउनवॉटेड। ** –

+1

ओउओ, मैं भाषण के एक रूप का उपयोग करता हूं और आप "ज़ूम वह वूडू में विश्वास करते हैं" (जैसा कि "हह के विरोध में, उन्होंने इसे जादू नहीं किया और कुछ स्थानीय भाषा का चयन किया।" कुछ अन्य प्रतिक्रियाएं जो परिणामों का जादू नहीं करतीं, और जब तक कि आप उन्हें अस्वीकार करने के लिए बाहर नहीं जाते, आप बस पक्षपातपूर्ण उच्च घोड़े पर साबुन बक्से का एक गुच्छा चढ़ रहे हैं। मैं मुद्दों का जादू क्यों नहीं करता (और क्यों सबसे अधिक इस धागे में लोग नहीं थे)? क्योंकि उचित साहित्य ढूंढना आसान है, जो किसी भी शोध के लिए उपलब्ध है। आपकी पसंद अगर आपको यह अनुचित लगता है। –

5

यह हमेशा एक अच्छा विचार संसाधनों का उपयोग करें, लेकिन बंद करने के लिए है:

आप संसाधन का उपयोग करते हैं संसाधन में एकबी, यह बी बजाय एक अगर यह बंद करने के लिए समझदार है इसके लिए एक विधि है।

आपके मामले में, आप, Workbook में FileInputStream उपयोग करें ताकि आप बेहतर चाहते Workbook को बंद करने और Workbok पर भरोसा करते हैं कि यह FileInputStream बंद हो जाएगा करने के लिए।

इस विशेष मामले में, वास्तव में, getWorkbook() विधि के अंत में Workbookwill closeFileInputStream लेकिन यह अभी भी closeWorkbook लिए एक अच्छा विचार है कचरा एकत्र होने के लिए सक्षम होने के लिए।

3

हाँ! आपके साथ किए जाने के बाद आपको हमेशा संसाधनों को छोड़ना चाहिए। जावा में कचरा संग्रह के लिए एक शक्तिशाली तंत्र है (ध्यान दें कि यह संसाधन प्रबंधन/लीक की तुलना में अलग बात है।) तो एक कचरा कलेक्टर यह निर्धारित नहीं कर सकता कि अगर आपको भविष्य में संसाधन की आवश्यकता है या नहीं? संसाधनों को जारी करने में विफल होने से समस्याएं हो सकती हैं- सेवाओं का अस्वीकार, खराब प्रदर्शन।

के रूप में पहले से ही उत्तर लेकिन एक और प्रयास कम रास्ता try with resources

try (FileInputStream fi = new FileInputStream("c:\\search.xls")) { 

     //do something with fi. 
     //fi.getChannel() ; 

    } catch(IOException e) { 
     // exception handling. 
    } finally { 
    // some statements for finally. 
    } 

अब आप स्पष्ट रूप से fi.close() विधि कॉल करने की आवश्यकता नहीं है।

0

हाल ही में, जब मैंने अपने कोड को दोबारा करने की कोशिश की, तो मुझे कार्यपुस्तिका निर्माण को किसी अन्य विधि में ले जाना पड़ा, और उस विधि में FileInputStream बनाया गया था। वह विधि एक FileInputStream बनाता है और एक कार्यपुस्तिका देता है। लेकिन FileInputStream मुख्य विधि से दिखाई नहीं दे रहा है; तो मैं मुख्य विधि के अंत में अपना FileInputStream कैसे बंद करूंगा? जवाब यह है कि, आपको FileInputStream को बंद करने की आवश्यकता नहीं है, इसके बजाय आप केवल कार्यपुस्तिका को बंद करें, जो आंतरिक रूप से FileInputStream को बंद कर देता है। संक्षेप में, यह कहना गलत है कि आपको FileInputStream को बंद करना होगा चाहे कोई फर्क नहीं पड़ता।

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