2010-05-04 6 views

Antwort

25

Ein IOException wird auf close geworfen, wenn der letzte flush fehlschlägt. Mögliche Ursachen sind:

  • das Dateisystem voll ist, oder der Benutzer über die Quote,
  • Festplattenfehler,
  • ein Dateisystem mit Gewalt post war,
  • ein Remote-Dateisystem ist nicht verfügbar aufgrund zur Vernetzung oder anderen Problemen,
  • (möglicherweise) ein Zeichencodierungsfehler in die Datei, wenn über ein OutputStreamWriter oder ähnlichen,
  • einen Gerätefehler zu schreiben, wenn die „Datei“ eine Gerätedatei ist,
  • eine verlorene Verbindung, wenn die verschließbaren ein Netzstrom ist,
  • ein Rohrbruch, wenn die verschließbaren ein Rohr zu externem Prozess,
  • und so weiter.

Ich habe sicherlich einige davon gesehen. Andere sind unwahrscheinlich.

Wenn jedoch die Daten, die Sie schreiben, wichtig sind, sollten Sie zulassen, dass close fehlschlägt. Wenn Ihre Anwendung beispielsweise eine kritische Datei ausgibt, die das Dateisystem ausfüllt, sollte Ihre Anwendung dies besser beachten, bevor sie die alte Kopie der Datei durch die abgeschnittene Version ersetzt.

+3

Interessante erzeugt werden .. .. –

2

Ich denke, Sie könnten versuchen, dies zu erzwingen, indem Sie die Diskette ausziehen, auf der sich Ihre Datei befindet. Aber auf jedem Closable? Ich denke, es wäre einfach, etwas zu bekommen, das einen Sockel benutzt, um beim Schließen eine Ausnahme zu erzeugen.

4

Ich habe nicht, aber es ist möglich. Stellen Sie sich vor, es gibt eine OutputStream, die aus irgendeinem Grund noch nicht in die Datei geschrieben hat. Nun, close() Aufruf wird die Daten spülen, aber wenn die Datei gesperrt ist - dann würde eine IOException ausgelöst werden.

6

Ja, es ist nicht so selten, IMHO, wenn Sie mit etwas anderem als nicht-lokalen Dateien arbeiten.

Close() funktioniert, wenn zu diesem Zeitpunkt Ihre schließbare noch gültig und offen ist. Viele Dinge wie Pipes, Remote-Dateien usw. können vorzeitig absterben.

Zusätzlich habe ich Code gesehen, der Fehler beim Öffnen und Schreiben ignoriert und immer noch versucht zu schließen (z. B. in einem endgültigen Block).

4

Nicht in Bezug auf Datei-io, aber in Bezug auf Sockets wird die Schließung IOException auslösen, wenn die andere Seite die Verbindung abgebrochen hat. Wenn Sie beispielsweise eine HTTP-Anfrage auf einer (großen) Webseite auslösen und dann sofort durch Klicken auf einen anderen Link auf der Webseite navigieren (während das Laden noch nicht abgeschlossen ist), erhält die Serverseite eine IOException (oder eine Unterklasse wie ClientAbortException in Tomcat-Servern und Clones), wenn der Ausgabestream der HTTP-Antwort geleert/geschlossen werden soll.

0

Ich habe - in meinen Unit-Tests gegen Mocks;)

2

Versuchen Sie, auf es ein USB-Laufwerk mit einer geöffneten Datei zerren. Wenn es keine Ausnahme gibt, wäre ich ziemlich überrascht.

4

Alte Post und längst beantwortet, aber hier ist ein echtes Beispiel:

Der folgende Code wird ausnehmen, wenn bufferedWriter.close() aufgerufen wird. Dies geschieht, weil der zugrundeliegende Writer des BufferedWriter (der FileWriter) bereits geschlossen wurde und wenn ein BufferedWriter geschlossen wird, versucht er zuerst, alle Daten in seinem Puffer zu seinem zugrundeliegenden Writer zu löschen.

File newFile = new File("newFile.txt"); 

FileWriter fileWriter = new FileWriter(newFile); 
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); 

bufferedWriter.write("Hello World"); 

fileWriter.close(); 
bufferedWriter.close(); 

Hinweis: Wenn es in dem Puffer keine Daten ist [Kommentar der write() Textzeile oder einen Flush() -Aufruf hinzufügen] dann wird keine Ausnahme

+0

+1 für ein Beispiel geben. – sleske

Verwandte Themen