Почему я получаю исключение при открытии пустого ZIP-файла с помощью java.util.zip.ZipFile? - PullRequest
3 голосов
/ 12 декабря 2008

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

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

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

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

Ответы [ 7 ]

5 голосов
/ 14 декабря 2008

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

2 голосов
/ 15 декабря 2008

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

2 голосов
/ 12 декабря 2008

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

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

1 голос
/ 05 января 2010

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

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

0 голосов
/ 14 декабря 2008

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

0 голосов
/ 12 декабря 2008

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

0 голосов
/ 12 декабря 2008

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

...