Ваш цикл выглядит корректным - что возвращает следующий код (только сам по себе)?
zipStream.read(tempBuffer)
если он возвращает -1, zipStream закрывается до того, как вы его получите, и все ставки отключены. Пришло время использовать ваш отладчик и убедиться, что то, что вам передают, действительно верно.
Когда вы вызываете getNextEntry (), возвращает ли оно значение и значат ли данные в записи (т.е. возвращает ли getCompressedSize () действительное значение)? Если вы просто читаете Zip-файл, в который не встроены zip-записи с упреждающим чтением, ZipInputStream не будет работать для вас.
Некоторые полезные моменты о формате Zip:
Каждый файл, встроенный в zip-файл, имеет заголовок. Этот заголовок может содержать полезную информацию (например, сжатую длину потока, его смещение в файле, CRC) - или он может содержать некоторые магические значения, которые в основном говорят: «Информация не находится в заголовке потока, вы должны проверить почтовый индекс '.
Каждый файл zip имеет таблицу, которая прикрепляется к концу файла, который содержит все записи zip вместе с реальными данными. Таблица в конце обязательна, а значения в ней должны быть правильными. Напротив, значения, встроенные в поток, указывать не нужно.
Если вы используете ZipFile, он читает таблицу в конце zip. Если вы используете ZipInputStream, я подозреваю, что getNextEntry () пытается использовать записи, встроенные в поток. Если эти значения не указаны, ZipInputStream не знает, какой длины может быть поток. Алгоритм накачки является самоограниченным (на самом деле вам не нужно знать несжатую длину выходного потока, чтобы полностью восстановить вывод), но возможно, что Java-версия этого считывателя не очень хорошо справляется с этой ситуацией.
Я скажу, что довольно необычно, когда сервлет возвращает ZipInputStream (гораздо чаще получить inflatorInputStream, если вы собираетесь получать сжатый контент.