когда java.util.zip.ZipFile.close () генерирует IOException? - PullRequest
6 голосов
/ 04 мая 2010

При каких обстоятельствах java.util.zip.ZipFile.close () создает исключение IOException? Его сигнатура метода указывает, что он может быть выдан, но из исходного кода, кажется, нет места, где это могло бы произойти, если только это не в собственном коде. Какие корректирующие действия, если таковые имеются, могут быть предприняты в момент обнаружения этого исключения?

Ответы [ 4 ]

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

Из документов API на ZipFile.close():

Закрытие этого файла ZIP закроет все входные потоки, ранее возвращенные вызовами метода getInputStream.

И InputStream.close() бросает IOException, поэтому ZipFile.close() тоже должен его бросить. В соответствии с документами API для InputStream.close() он выдает IOException «если возникает ошибка ввода-вывода». Это не очень наглядно, но это бросает широкую сеть. InputStreams может представлять потоки, поступающие из файловой системы, сети, памяти и т. Д. InputStreams может включать буферы, которые необходимо очистить, сокеты, которые должны быть закрыты, ресурсы, которые должны быть освобождены, блокировки, которые должны быть освобождены, и т. Д. Исключения IOException случиться по разным причинам.

1 голос
/ 04 мая 2010

От близкого человека (2):

Не проверка возвращаемого значения close () является распространенной, но, тем не менее, серьезной ошибкой программирования. Вполне возможно, что ошибки в предыдущей операции write (2) сначала сообщаются в финальном закрытии (). Не проверка возвращаемого значения при закрытии файла может привести к потере данных без вывода сообщений. Это особенно заметно в случае NFS и дисковой квоты.

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

Документация для ZipFile.close() гласит:

Закрытие этого файла ZIP закроет все входные потоки, ранее возвращенные вызовами метода getInputStream.

Предположительно, собственный метод close выполняет закрытие InputStreams.

Метод close для InputStream имеет IOException в качестве проверенного исключения.

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

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

Я не уверен, но я думаю, что IOException генерируется, когда происходит одно из следующих событий:

  • Файл zip был удален кем-то / кем-то вне приложения.
  • Когда диск, содержащий zip-файл, отключен / отключен

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

...