2013-01-30 25 views
9

मैं हाल ही में फेंकना शुरू कर दिया एक त्रुटि के साथ थोड़ा उलझन में हूँ।FileInputStream को बंद करने का तरीका "डिवाइस पर कोई स्पेस नहीं छोड़ा गया" त्रुटि का कारण बन सकता है?

java.io.IOException: No space left on device 
    at java.io.FileInputStream.close0(Native Method) 
    at java.io.FileInputStream.close(FileInputStream.java:259) 
    at java.io.FilterInputStream.close(FilterInputStream.java:155) 

मैं यह सोचते हैं कि इस के बाद एक FileInputStream कि इस फाइल स्मृति में आयोजित किया जा रहा है, और भौतिक डिस्क पर नहीं है,। मेमोरी के स्तर बहुत अच्छे लगते हैं, और डिस्क स्थान के रूप में। यह विशेष रूप से भ्रमित है क्योंकि यह FileInputStream के करीब होता है। किसी भी स्पष्टीकरण के लिए धन्यवाद जो आपके पास हो सकता है कि यह कैसे हो सकता है।

संपादित करें: समीक्षा

if (this.file.exists()) { 
      DataInputStream is = new DataInputStream(new FileInputStream(this.file)); 
      this.startDate = new DateTime(is.readLong(), this.timeZone); 
      this.endDate = new DateTime(is.readLong(), this.timeZone); 
      is.close(); 
     } 

आप देख ऊपर मैं केवल फ़ाइल खोलने रहा हूँ, कुछ सामग्री पढ़ने, और फिर फ़ाइल को बंद करने के रूप में कर सकते हैं के लिए कोड।

+0

कारण है कि आप कोड पेस्ट नहीं? – lichengwu

+0

स्पष्टीकरण के लिए कोड जोड़ा गया। – Judicator

+0

ओएस डिस्क पर कुछ सामान लिख रहा है, एक्सेस लॉग इत्यादि हो सकता है – SpaceTrucker

उत्तर

2

इस मामले में, IOException को native विधि से हटा दिया गया है जो स्ट्रीम को बंद कर देता है।

कारण यह एक अपवाद फेंक परिभाषित किया गया है क्योंकि close कार्रवाई निष्पादित करता है एक अंतिम flush - इस प्रकार, एक IOException फ्लश के दौरान होता है अगर यह फेंक दिया जाएगा।

  • आप विशिष्ट फ़ोल्डर पर लिखने की अनुमति की कमी हो सकती:

    वहाँ अपवाद के लिए आपको प्राप्त कई कारण हैं।

  • आपने अपना कोटा पार कर लिया होगा।

मैं भी व्यक्तिगत रूप से सुझाव है कि आप धारा को बंद करने के लिए निम्न विधि का उपयोग करें:

if (this.file.exists()) { 
    try { 
     DataInputStream is = new DataInputStream(new FileInputStream(this.file)); 
     this.startDate = new DateTime(is.readLong(), this.timeZone); 
     this.endDate = new DateTime(is.readLong(), this.timeZone); 
    } catch (Exception ex) { 
     // Handle the exception here 
    } finally { 
     is.close(); 
    } 
} 

तुम भी IOUtils विधि closeQuietly है कि आप नहीं कर रहे हैं आपके मामले में एक अपवाद क्योंकि फेंक नहीं है का उपयोग कर सकते फ़ाइल को बदलना और शायद आपको close विधि के परिणाम में रूचि नहीं है।

संपादित करें:

हेनरी सही है। मैंने InputStream पढ़ा और स्वचालित रूप से इसे अपने दिमाग में OutputStream पर बदल दिया।

InputStream पर एक close आपरेशन फ़ाइल स्वयं परिवर्तित नहीं होता, फ़ाइल का metadata बदल सकते हैं - इस तरह के पिछले उपयोग समय के रूप में, आदि

+0

यह अभी भी 'इनपुटस्ट्रीम' पर प्राप्त करने के लिए आश्चर्यजनक है। – Henry

+0

@ हेनरी - आप सही हैं। – Michael