Вы когда-нибудь видели, чтобы Java File close () вызывал исключение? - PullRequest
22 голосов
/ 04 мая 2010

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

Ответы [ 8 ]

27 голосов
/ 04 мая 2010

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

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

Я наверняка видел некоторые из них.Другие маловероятны.

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

6 голосов
/ 04 мая 2010

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

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

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

4 голосов
/ 07 января 2011

Старый пост и давно ответили, но вот реальный пример:

Следующий код исключается при вызове bufferedWriter.close (). Это происходит потому, что базовый модуль записи BufferedWriter (FileWriter) уже закрыт, а когда объект BufferedWriter закрывается, он сначала пытается сбросить любые данные в своем буфере в свой базовый модуль записи.

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

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

bufferedWriter.write("Hello World");

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

Примечание : если в буфере нет данных [закомментировать строку write () или добавить вызов flush ()] , исключение не будет сгенерировано

4 голосов
/ 04 мая 2010

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

4 голосов
/ 04 мая 2010

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

2 голосов
/ 04 мая 2010

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

2 голосов
/ 04 мая 2010

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

0 голосов
/ 04 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...