Я хочу открыть ZIP-файл, в котором нет записей с java.util.zip.ZipFile. Но в конструкторе я получаю следующее исключение: «java.util.zip.ZipException: ошибка при открытии zip-файла». Как открыть пустой ZIP-файл?
Этот ZIP-файл создается zip-программой командной строки под Linux. Я просто удалил все записи из ZIP-файла.
Мне это нужно как тестовые данные для класса, который я пишу. В этом случае класс должен просто возвращать пустой список, а битые ZIP-файлы должны возвращать ошибку.
Для более подробного объяснения проблемы. У меня есть интерфейс для извлечения некоторых документов из разных источников. Другие реализации собирают их из веб-сервисов или каталогов, эта реализация из ZIP-файлов. Интерфейс дает Итератору дополнительную функциональность. Итак, я хочу решить, пустой или поврежденный ZIP-файл.
Его размер меньше 22 байтов. Я создал его с помощью командной строки-zip, удалив все записи.




Я не знаю, почему это реализовано таким образом, но почему вам нужно успешно открывать пустой Zip-файл? В любом случае вы не можете изменить его с помощью java.util.zip.ZipFile ...
Таким образом, вы можете просто перехватить исключение ZipException (которое создается для файлов zip недопустимого формата) и пропустить файл, если вы его поймаете.
В моем случае использования я раньше не знал, что файл будет пустым. Класс, который я пишу, должен работать правильно и в этом случае.
Как определить, пустой это ZIP-файл или битый ZIP-файл? И у меня нет ZipFile-объекта, с которым можно было бы работать.
Вы уверены, что вам нужно знать, плохой он или пустой? В обоих случаях это бесполезно для вашей программы. Таким образом, для бесполезного файла в принципе не требуется никаких объектов. Если я ошибаюсь, тогда вам стоит объяснить свою цель, может быть, мы сможем найти лучшее решение.
Вы уверены, что это правильный zip-файл? Это было бы моим первым предположением.
В формате ZIP есть ошибки проверьте JDK здесь.
Пустой почтовый индекс не является ошибкой, это пустой почтовый индекс. Невозможно отличить пустой zip-архив от файла изображения, открытого как zip-архив.
Используйте ZipOutputStream.
взлом: вы можете предположить, что все пустые ZIP-файлы одинаковы, и просто жестко запрограммируйте его длину / контрольную сумму для проверки.
Это действительно хитрость, но она действительно может сработать. По крайней мере, стоит проголосовать, спасибо. :-)
Мое решение этой проблемы теперь состоит в том, что я просто использую ZipInputStream вместо ZipFile. Этот класс хорошо работает с пустыми ZIP-файлами. Не знаю, почему один работает, а другой нет.
Я думаю, что причина, по которой ZipInputStream работает, а ZipFile - нет, заключается в двух разных способах чтения zip-файлов. Конструктор ZipFile пытается прочитать оглавление ZipFile, которое записывается в конец файла. Если он не может прочитать оглавление, он генерирует исключение ZipException (почти без полезной информации в нем), что, я думаю, и есть то, что вы видите. Однако ZipInputStream считывает записи из zip-файла последовательно, начиная с его начала, поэтому в этом случае он кажется более надежным.
Все это очень плохо документировано, и я сам сталкивался с подобными проблемами, используя ZipFile. Оба метода чтения из zip-файла допустимы, но можно подумать, что в документации API будут упоминаться последствия произвольного доступа / метода TOC чтения через конструктор по сравнению с чтением через ZipInputStream.
Это пустой (но все еще хорошо сформированный ZIP-файл с заголовками и т. д.) Или файл с нулевым байтом?