2012-07-26 12 views
13

Meine App schreibt ständig viele Bytes in eine Datei. Wenn ein Block meines Codes Bytes ausgibt und eine IOException auslöst, wenn die Verbindung zum Laufwerk oder Netzwerk verloren ist, wie soll ich wissen, wie viele Bytes er geschrieben hat?IOException-Behandlung während des Schreibens der Datei in Java

Zum Beispiel schreibe ich 2500 Bytes gleichzeitig und wenn eine IOException auftritt, bedeutet das, dass es nichts in die Datei geschrieben hat oder Teilbytes in die Datei geschrieben hätte? Wenn Teil Bytes in die Datei geschrieben werden, wie soll ich wissen, wie viel

geschrieben

FYI bin ich mit

DataOutputStream 

auf Dateien zu schreiben. Ich spüle nur, wenn meine App geschlossen wird.

+0

Mit welcher Methode schreiben Sie in die Datei? Ich bin ziemlich sicher, dass etwas wie ein BufferedOutputStream Ihnen ein anderes Ergebnis als nur ein OutputStream geben würde. – xthexder

+0

können Sie auch http://StackOverflow.com/questions/1742361/flush-in-java-io-filewriter überprüfen, dies kann Ihnen auch helfen – MaVRoSCy

Antwort

6

Sie können nicht, IOException kann jederzeit passieren. Wenn Sie darüber nachdenken, kann IOException jederzeit durch Software- oder Hardwarefehler verursacht werden, bevor das erste Byte geschrieben wurde, nachdem alle geschrieben wurden, aber etwas mit der Verbindung passiert ist - oder in der Mitte, wenn der Datenblock ziemlich groß war.

Nach der erneuten Verbindung müssen Sie die Dateigröße überprüfen oder eine andere Technik verwenden, um Dateien in einem konsistenten Zustand zu halten und wiederherzustellen. Das einfachste Sicherheitsnetz: Lesen Sie die Dateigröße, bevor Sie Daten schreiben und speichern, schreiben Sie die Daten und lesen Sie die Dateigröße nach dem Schreiben. Wenn der Fehler auftritt und die aktuelle Dateigröße nicht der erwarteten Dateigröße entspricht (zuletzt gespeichert), schneiden Sie zusätzliche Bytes ab und versuchen Sie es erneut.

Lesen Sie über Transaktionsprotokolle in relationalen Datenbanken, um zu sehen, wie große und zuverlässige Software solche Fälle behandelt.

1

Es hängt davon ab, wie der Schreib versagt, aber die InterruptedIOException kann sein, was Sie suchen:

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InterruptedIOException.html

Es enthält ein Feld für „bytesTransferred“: „Berichte, wie viele Bytes hatten im Rahmen der E/A-Operation übertragen, bevor sie unterbrochen wurde. "

+0

Dies ist die Art von Ausnahme, die ich gesucht habe, werde ich experimentieren und Bericht erstatten wenn Versuch fangen funktioniert !! Danke – Vig

+0

Es kann sein. Aber das ist für jede IO-Operation, und nicht die gesamte Übertragung, wenn ich mich nicht irre ... –

+0

Diese Ausnahme gilt nur, wenn der Thread unterbrochen wurde, nicht, wenn es ein echtes I/O-Problem gab, wie das OP fragt. – EJP

Verwandte Themen