2013-01-30 9 views
9

Sono un po 'confuso con un errore il mio programma ha iniziato a lanciare di recente.In che modo la chiusura di un FileInputStream può causare un errore "Spazio vuoto sul dispositivo"?

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) 

Io parto dal presupposto che dal momento che questo è un FileInputStream, che questo file sia mantenuto in memoria, e non sul disco fisico. I livelli di memoria sono fantastici, così come lo spazio su disco. Ciò è particolarmente confuso poiché si verifica alla chiusura di FileInputStream. Grazie per eventuali spiegazioni che potresti avere su come ciò possa accadere.

EDIT: Codice per la revisione

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

Come potete vedere sopra io sono solo l'apertura del file, la lettura di alcuni contenuti, e quindi chiudere il file.

+0

perché non incollare il vostro codice? – lichengwu

+0

Aggiunto codice per chiarimenti. – Judicator

+0

potrebbe essere il sistema operativo sta scrivendo alcune cose su disco, access logs ecc. – SpaceTrucker

risposta

2

In questo caso, il IOException viene generato dal metodo native che chiude lo streaming.

Il motivo è definito un'eccezione è perché l'operazione close esegue una finale flush - quindi, se un IOException verifica durante il colore sarà gettato.

ci sono diverse ragioni per l'eccezione si è ricevuto:

  • Si possono mancare i permessi di scrittura sulla cartella specifica.

  • Potrebbe essere stata superata la quota.

ho anche personalmente suggerisco di utilizzare il seguente metodo di chiudere il flusso:

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

È anche possibile utilizzare IOUtils metodo closeQuietly che non buttare una causa un'eccezione' nel tuo caso non si è cambiando il file e probabilmente non sei interessato al risultato del metodo close.

EDIT:

Henry è giusto. Ho letto InputStream e l'ho cambiato automaticamente nella mia mente su OutputStream.

Un close operazione sul InputStream non modifica il file stesso, ma può cambiare il metadata del file - come ora dell'ultimo accesso, ecc

+0

È comunque sorprendente ottenere questo risultato su un 'InputStream'. – Henry

+0

@ Henry - Hai ragione. – Michael