Почему я получаю исключение при открытии пустого ZIP-файла с помощью java.util.zip.ZipFile?

Я хочу открыть ZIP-файл, в котором нет записей с java.util.zip.ZipFile. Но в конструкторе я получаю следующее исключение: «java.util.zip.ZipException: ошибка при открытии zip-файла». Как я могу открыть пустой ZIP?

Этот ZIP-файл создается zip-программой командной строки под Linux. Я просто удалил все записи из ZIP-файла.

Мне это нужно как тестовые данные для класса, который я пишу. В этом случае класс должен просто возвращать пустой список, а битые ZIP-файлы должны возвращать ошибку.

Для некоторых дополнительных пояснений по проблеме. У меня есть интерфейс для извлечения некоторых документов из разных источников. Другие реализации собирают их из веб-сервисов или каталогов, эта реализация из ZIP-файлов. Интерфейс дает Iterator с некоторыми дополнительными функциями. Итак, я хочу решить, является ли ZIP-файл пустым или поврежденным.


person Mnementh    schedule 12.12.2008    source источник
comment
Является ли он пустым (но все же правильно сформированным ZIP-файлом с заголовками и т. д.) или файлом с нулевым байтом?   -  person McDowell    schedule 12.12.2008
comment
Он имеет размер от 22 байт. Я создал его с помощью командной строки-zip, удалив все записи.   -  person Mnementh    schedule 12.12.2008


Ответы (7)


hack: вы можете предположить, что все пустые ZIP-файлы одинаковы, и просто жестко закодировать их длину / контрольную сумму для проверки.

person Yoni Roit    schedule 14.12.2008
comment
Это действительно хак, но он действительно может работать. По крайней мере стоит плюса, спасибо. :-) - person Mnementh; 15.12.2008

Я не знаю, почему это реализовано таким образом, но почему вам нужно успешно открыть пустой Zip-файл? В любом случае вы не можете изменить его с помощью java.util.zip.ZipFile...

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

person bezmax    schedule 12.12.2008
comment
В моем случае я раньше не знал, что файл будет пустым. Класс, который я пишу, должен работать корректно и в этом случае. - person Mnementh; 12.12.2008
comment
Как мне решить, это пустой ZIP-файл или битый ZIP-файл? И у меня нет ZipFile-объекта для работы. - person Mnementh; 12.12.2008
comment
Вы уверены, что вам нужно знать, если это плохо или пусто? В обоих случаях это бесполезно для вашей программы. Таким образом, вам в принципе не нужен какой-либо объект для бесполезного файла. Если я ошибаюсь, то вы должны объяснить свою цель, может быть, мы могли бы найти лучшее решение. - person bezmax; 12.12.2008

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

person Mnementh    schedule 15.12.2008

Я думаю, что причина, по которой ZipInputStream работает, а ZipFile — нет, заключается в двух разных способах чтения zip-файлов. Конструктор ZipFile пытается прочитать оглавление ZipFile, которое записывается в конец файла. Если он не может прочитать оглавление, он выдает ZipException (почти без полезной информации), что, я думаю, вы и видите. ZipInputStream, однако, считывает записи из zip-файла последовательно, начиная с начала файла, поэтому в этом случае он кажется более надежным.

Все это очень плохо документировано, и я сам сталкивался с подобными проблемами, используя ZipFile. Оба метода чтения из zip-файла допустимы, но можно подумать, что в документации по API упоминаются последствия метода произвольного доступа/TOC для чтения через конструктор по сравнению с чтением через ZipInputStream.

person Jeff    schedule 05.01.2010

Вы уверены, что это правильный zip-файл? Это было бы мое первое предположение.

person recursive    schedule 12.12.2008

В формате файла ZIP есть ошибки проверьте JDK здесь.

person yrcjaya    schedule 12.12.2008
comment
Пустой почтовый индекс — это не ошибка, это пустой почтовый индекс. Невозможно отличить пустой почтовый индекс от файла изображения, открытого как почтовый индекс. - person TWiStErRob; 09.09.2016

Используйте ZipOutputStream.

person Tom Hawtin - tackline    schedule 14.12.2008