Можно ли определить размер файла для распаковки?

1

В настоящее время у меня есть следующий код, который использует ZipInputStream для распаковки zip файла в целевое местоположение на телефоне:

ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(sourceZipFile));
ZipEntry zipEntry = null;

while ((zipEntry = zipInputStream.getNextEntry()) != null)
{
  File zipEntryFile = new File(targetFolder, zipEntry.getName());
  // write contents of 'zipEntry' to 'zipEntryFile'

Кто-нибудь знает, возможно ли это (используя установку выше или иначе), чтобы получить (оценку) общее количество файлов или байтов, которые нужно распаковать до начала, а также увеличить прогресс по мере продолжения декомпрессии? Я думал, что ZipInputStream может иметь getTotalEntries() или аналогичный метод, но не может найти ничего подобного...

Теги:
android-asynctask

2 ответа

3
Лучший ответ

Используйте метод ZipEntry#getSize(). Он возвращает размер несжатого файла.

Если у вас есть несколько записей (файлов) внутри ZIP файла, сначала проведите их сначала (без их извлечения) и соедините все размеры файлов. Это может быть довольно неплохая оценка.

Обратите внимание: если вам нужно знать точное количество байтов, которые эти файлы будут занимать на диске, вам также необходимо знать точный размер cluster в вашей файловой системе.

  • 0
    отличный комментарий о кластере !!!
  • 0
    Спасибо за ответ. Я натолкнулся на класс java.util.zip.ZipFile который имеет метод size() а также метод entries() для получения доступа к записям zip. Я подумываю использовать это вместо ZipInputStream чтобы избежать необходимости делать двойной проход через записи zip. Вы случайно не знаете, ZipFile ли два ( ZipFile и ZipInputStream ) классы с точки зрения производительности, использования памяти и т. Д.?
Показать ещё 1 комментарий
1

Как указано в npe, ZipEntry получит несжатый размер файла из zip файла.

Я думаю, что вам нужно будет сделать один проход, используя

getNextEntry

пока не будет сделано, подсчет записей по пути (размер и количество записей), затем перезапустите фактическую декомпрессию после этого

  • 0
    Пожалуйста, смотрите комментарий к ответу npe.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню