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