Подтвердить что ты не робот

Обработка IOException во время записи файла в java

Мое приложение постоянно записывает множество байтов в файл. Если блок моего кода записывает байты и получает исключение IOException, если соединение с диском или сетью теряется, как мне узнать, сколько байтов оно записало?

Например, я пишу по 2500 байтов за раз, и если возникает событие IOException, значит ли это, что он ничего не написал для файла или он бы написал частичные байты в файл? Если в файл записаны частичные байты, как мне знать, сколько написано

FYI Я использую

DataOutputStream

чтобы выписать файлы. Я скрываю только, когда мое приложение закрывается.

4b9b3361

Ответ 1

Вы не можете, IOException может произойти в любое время. Если вы думаете об этом, IOException может быть вызвано сбой программного обеспечения или аппаратного обеспечения в любое время, прежде чем первый байт был написан, ведь все было написано, но что-то случилось с соединением - или посередине, если блок данных был довольно большой.

После повторного подключения вы должны проверить размер файла или использовать какую-либо другую технику, чтобы поддерживать согласованное состояние файлов и восстанавливать их. Простейшая защитная сетка: прочитайте размер файла перед записью данных и надежно сохраните их, напишите данные и прочитайте размер файла после записи. Если ошибка возникает, а текущий размер файла не равен ожидаемому размеру файла (последний сохранен), обрезайте лишние байты и повторите попытку.

Ознакомьтесь с журналами транзакций в реляционных базах данных, чтобы узнать, как большое и надежное программное обеспечение обрабатывает такие случаи.

Ответ 2

Это зависит от того, как сбой записи, но InterruptedIOException может быть тем, что вы ищете:

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

Он содержит поле для "bytesTransferred": "Сообщает, сколько байтов было передано как часть операции ввода-вывода до того, как оно было прервано".