В настоящее время у меня есть следующий код, который использует 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()
или аналогичный метод, но не может найти ничего подобного...
Используйте метод ZipEntry#getSize()
. Он возвращает размер несжатого файла.
Если у вас есть несколько записей (файлов) внутри ZIP файла, сначала проведите их сначала (без их извлечения) и соедините все размеры файлов. Это может быть довольно неплохая оценка.
Обратите внимание: если вам нужно знать точное количество байтов, которые эти файлы будут занимать на диске, вам также необходимо знать точный размер cluster
в вашей файловой системе.
Как указано в npe, ZipEntry получит несжатый размер файла из zip файла.
Я думаю, что вам нужно будет сделать один проход, используя
getNextEntry
пока не будет сделано, подсчет записей по пути (размер и количество записей), затем перезапустите фактическую декомпрессию после этого
java.util.zip.ZipFile
который имеет методsize()
а также методentries()
для получения доступа к записям zip. Я подумываю использовать это вместоZipInputStream
чтобы избежать необходимости делать двойной проход через записи zip. Вы случайно не знаете,ZipFile
ли два (ZipFile
иZipInputStream
) классы с точки зрения производительности, использования памяти и т. Д.?