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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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()], то никакое исключение не будет создано

Ответ 6

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

Ответ 7

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

Ответ 8

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