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

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

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

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

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

Это пустой (но все еще хорошо сформированный ZIP-файл с заголовками и т. д.) Или файл с нулевым байтом?

McDowell 12.12.2008 18:26

Его размер меньше 22 байтов. Я создал его с помощью командной строки-zip, удалив все записи.

Mnementh 12.12.2008 18:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
4 181
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

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

Mnementh 12.12.2008 18:30

Как определить, пустой это ZIP-файл или битый ZIP-файл? И у меня нет ZipFile-объекта, с которым можно было бы работать.

Mnementh 12.12.2008 18:44

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

bezmax 12.12.2008 18:47

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

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

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

TWiStErRob 09.09.2016 18:18

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

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

Это действительно хитрость, но она действительно может сработать. По крайней мере, стоит проголосовать, спасибо. :-)

Mnementh 15.12.2008 11:15
Ответ принят как подходящий

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

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

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

Другие вопросы по теме