2013-01-30 29 views
9

Jestem trochę zdezorientowany z powodu błędu, który mój program zaczął ostatnio rzucać.W jaki sposób zamknięcie obiektu FileInputStream może spowodować błąd "Brak miejsca na urządzeniu?"

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) 

Zakładam, że ponieważ jest to FileInputStream, ten plik jest przechowywany w pamięci, a nie na dysku fizycznym. Poziomy pamięci wyglądają świetnie, podobnie jak przestrzeń dyskowa. Jest to szczególnie mylące, ponieważ dzieje się to przy zamknięciu FileInputStream. Dziękuję za wszelkie wyjaśnienia, które możesz mieć na temat tego, jak to może się zdarzyć.

EDIT: Kod do przeglądu

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(); 
     } 

Jak widać powyżej mam tylko otwierania pliku, czytając jakąś treść, a następnie zamyka plik.

+0

dlaczego nie przenieść twój kod? – lichengwu

+0

Dodany kod do wyjaśnienia. – Judicator

+0

może być os pisze niektóre rzeczy na dysku, logi dostępu itp. – SpaceTrucker

Odpowiedz

2

W tym przypadku IOException jest wyrzucane z metody native, która zamyka strumień.

Powodem zdefiniowania wyjątku jest wykonanie operacji close końcowej flush - w ten sposób, jeśli wystąpi IOException podczas spłukiwania, zostanie rzucony.

Istnieje kilka powodów, dla wyjątku zostały odebrane:

  • może brak uprawnień do zapisu w określonym folderze.

  • Być może przekroczyłeś limit.

Ja również osobiście sugerują, że można użyć następującego sposobu zamykania strumienia:

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(); 
    } 
} 

Można również użyć IOUtils metodę closeQuietly to nie wyjątek, bo w przypadku, gdy nie są zmieniając plik i prawdopodobnie nie jesteś zainteresowany wynikiem metody close.

EDIT:

Henry ma rację. Przeczytałem InputStream i automatycznie zmieniłem to w mojej głowie na OutputStream.

close operacja na InputStream nie zmienia samego pliku, ale może zmienić metadata pliku - jak ostatni czas dostępu, itd

+0

To wciąż zaskakujące, aby uzyskać to na 'InputStream'. – Henry

+0

@Henry - Masz rację. – Michael