Android 3.x + Java Класс ZipFile - Не удается прочитать ZipEntries из больших файлов

Если я открою большой zip-файл (250 МБ) через класс ZipFile и попытаюсь прочитать записи. Это отлично работает на 2.x в эмуляторе и на реальном оборудовании. Если я использую точный код на моем планшете (Asus Transformer под управлением 4.0.3) или в эмуляторе (3.2), я не могу прочитать какие-либо записи. Функция size () класса ZipFile всегда возвращает ноль, а ZipFile не возвращает никаких записей zip. Даже приложение zip, которое поставляется с ПЗУ на моем планшете, не может читать записи. ZIP-файл не поврежден. Я проверил это.

Код для чтения из ZipFile отлично работает во всех версиях с меньшими zip-файлами. Что изменилось между 2.x и 3.x / 4.x ??

Мой тестовый файл - это C64Music.zip из коллекции HighVoltage Sid. Он содержит более 40 000 файлов и занимает около 250 МБ.

Я понятия не имею, где смотреть.


person wbb    schedule 30.03.2012    source источник
comment
Вы пробовали читать другие zip-файлы на своем Asus или эмуляторе, работающем под управлением 3.x / 4.x? Проблема только в этом zip файле?   -  person David Wasser    schedule 24.05.2012
comment
Вы проглатываете какие-то исключения? Если нет, возвращает ли getName () имя zip-файла? (Простой тест, но может произойти что-то удивительное). Получите ли вы другие результаты, если откроете zip-архив с флагом OPEN_READ или без него?   -  person JD.    schedule 03.07.2012
comment
Я не уверен, не могли бы вы попробовать с JarFile?…   -  person    schedule 10.07.2012
comment
Попробуйте использовать zip-архив, в котором меньше 32 КБ файлов.   -  person Nathan Moinvaziri    schedule 11.07.2012
comment
Вы смотрели файл в файловой системе на вкладке преобразователя? Вы должны сделать это и сравнить суммы MD5.   -  person hsanders    schedule 12.07.2012


Ответы (2)


Это известная проблема с реализацией Android ZipFile:

http://code.google.com/p/android/issues/detail?id=23207

Обычно zip-файлы поддерживают до 65 тыс. Записей. Существует расширенная версия формата zip-файла под названием Zip64, которая поддерживает большее количество записей. К сожалению, ZipFile на Android не может читать Zip64. Вы, вероятно, обнаружите, что файл C64Music.zip находится в формате Zip64.

Обходной путь - использовать библиотеку Apache Commons Compress вместо собственной реализации. Их версия ZipFile поддерживает Zip64: http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html

person Luke Sleeman    schedule 15.08.2012

В 3.x / 4.x было внесено множество изменений для предотвращения злоупотреблений в отношении потока пользовательского интерфейса. Следовательно, возможно, что ваше приложение вылетает из-за того, что вы не переносите дорогостоящую операцию ввода-вывода на отдельный Thread.

person Alex Lockwood    schedule 17.07.2012