Вы когда-либо видели, что Файл Java близко () выдает исключение?

Кто-либо когда-либо видел исключение, выданное при вызове близкого метода на каком-либо closable объекте?

22
задан CPerkins 5 May 2010 в 12:17
поделиться

7 ответов

Исключение IOException будет выдано на close , если окончательный сброс завершится неудачно. Возможные причины включают:

  • файловая система заполнена или пользователь превышает квоту,
  • ошибки жесткого диска,
  • файловая система была принудительно отключена,
  • удаленная файловая система недоступна из-за сети или другие проблемы,
  • (возможно) ошибка кодировки символов при записи в файл через OutputStreamWriter или аналогичный,
  • ошибка устройства, если «файл» является файлом устройства,
  • потеряно соединение, если закрываемый объект является сетевым потоком,
  • разорванный канал, если закрываемый объект является каналом для внешнего процесса,
  • и так далее.

Я определенно видел некоторые из них. Остальные маловероятны.

Однако, если данные, которые вы пишете, важны, вы должны разрешить сбой close . Например, если ваше приложение записывает критический файл, который заполняется файловой системой, вашему приложению лучше заметить это, прежде чем оно заменит старую копию файла усеченной версией.

27
ответ дан 29 November 2019 в 04:17
поделиться

Да, это не так уж редко, ИМХО, если вы работаете с чем-либо, кроме нелокальных файлов на диске .

Close () работает, если в этот момент закрываемый объект еще действителен и открыт. Многие вещи, такие как каналы, удаленные файлы и т. Д., Могут умереть преждевременно.

Кроме того, я видел код, который игнорирует ошибки при открытии и записи и по-прежнему пытается закрыть (например, в блоке finally).

6
ответ дан 29 November 2019 в 04:17
поделиться

У меня - в моих модульных тестах против моков ;)

0
ответ дан 29 November 2019 в 04:17
поделиться

Не в плане file-io, но в плане сокетов закрытие вызовет IOException, когда другая сторона прервет соединение. Например, когда вы отправляете HTTP-запрос на (большую) веб-страницу, а затем сразу же уходите, щелкнув по другой ссылке на веб-странице (пока она не закончила загружаться), то на стороне сервера будет получен IOException (или подкласс вроде ClientAbortException в серверах Tomcat и клонах), когда выходной поток HTTP-ответа должен быть смыт/закрыт.

4
ответ дан 29 November 2019 в 04:17
поделиться

Я думаю, вы можете попытаться принудительно выполнить это, отключив диск, на котором находится ваш файл. А на каком Closable ? Я думаю, было бы легко получить что-то, что использует сокет для исключения исключения при закрытии.

2
ответ дан 29 November 2019 в 04:17
поделиться

Попробуйте выдернуть USB-накопитель с открытым файлом на нем. Если это не приведет к исключению, я буду очень удивлен.

2
ответ дан 29 November 2019 в 04:17
поделиться

Нет, но это возможно.Представьте, что существует OutputStream , который по какой-то причине еще не записал в файл. Что ж, вызов close () сбрасывает данные, но если файл заблокирован - тогда возникает исключение IOException .

4
ответ дан 29 November 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: