Как распаковать большой zip-файл и записать в SDCARD за меньшее время

Чтобы распаковать zip-файл, я использовал классы из пакета java.util.zip *, указав это, и он работает правильно, однако для разархивирования файла размером 40 МБ требуется 59 секунд. Когда я пробовал один и тот же zip-файл в проекте iPhone ( мы разрабатываем приложение для обеих платформ – Android & iPone и обладающее функциями для распаковки zip-файла и сохранения распакованного содержимого в SDCARD-Android или в каталоге документов – iPhone ), требуется всего 14 секунд. Приложение iphone использует ziparchive .

Поэтому мой вопрос:

1. По сравнению с экспериментом он очищает эту операцию распаковки и записи файла в SDCARD в Java, потребляет больше времени по сравнению с iPhone-приложением, поэтому я решил использовать разблокировку на уровне C / C ++ и операцию записи файлов с помощью NDK. Это правильный выбор?

2. Я искал в google, stackoverflow, и некоторые предложили использовать minizip, но нет достаточной помощи в том, как использовать minizip в android. Является ли anyboday попыткой minizip для android?

3. Я также пробовал разработку NDK для libz для достижения моей цели, поскольку Libz добавлен в NDK, но не получает, как его использовать. Кто-нибудь пробовал libz в NDK?

4. Есть ли какая-либо другая Framework в Java или C / C ++, которая распаковывает большой ZIP-файл и записывает их в SDCARD за меньшее время?

Пожалуйста, помогите мне.

Вот мой код Unzip для Java:

public String unzip() { String result; try { FileInputStream fin = new FileInputStream(this.filePath); ZipInputStream zin = new ZipInputStream(fin); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.v("Unzip", "Unzipping " + ze.getName()); if (ze.isDirectory()) { _dirChecker(ze.getName()); } else { // Read 16 k at a time byte[] buffer = new byte[16*1024]; int read; FileOutputStream fout = new FileOutputStream(this.location+ "/" + ze.getName()); while ((read = zin.read(buffer)) != -1) { fout.write(buffer, 0, read); } zin.closeEntry(); fout.close(); } } zin.close(); result = "success"; } catch (Exception e) { Log.e("unzip", "unzip", e); result = "failure"; } return result; } 

Solutions Collecting From Web of "Как распаковать большой zip-файл и записать в SDCARD за меньшее время"

Почему бы вам не попробовать этот код. Он работает потрясающе

  String zipname = "data.zip"; FileInputStream fis = new FileInputStream(zipname); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { System.out.println("Unzipping: " + entry.getName()); int size; byte[] buffer = new byte[2048]; FileOutputStream fos = new FileOutputStream(entry.getName()); BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length); while ((size = zis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, size); } bos.flush(); bos.close(); } zis.close(); fis.close(); 

}

Все распакованные коды заканчиваются в zlib. В Java core libs нет реализации Java «спящего» сжатия.

Единственная причина, по которой java.util.Zip должен быть медленнее, чем «родной» unzip, если файл ввода-вывода выполняется плохо, например, что-то использует действительно небольшие буферы. Рассматривая код, связанный с вопросом, это именно то, что происходит – он работает с отдельными байтами.

Один из комментариев к решению предоставил патч, в котором используется буфер 4K. Снимите это и посмотрите, что произойдет с вашей работой.

Попробуйте просто написать файл 40 Мб на SDCard и измерить затраченное время. (Почти) все бесплатные (или даже платные) реализации библиотек поддержки архива zip основаны на одном и том же zlib-коде, который занимает большую часть скорости обработки при распаковке. Java-код должен быть намного медленнее, чем обычный, поэтому я предлагаю попробовать раскручивать NDK. Кроме того, попытка распаковать архив с нулевым уровнем сжатия даст вам представление о том, сколько времени занимает распаковка кода и сколько времени тратится на простое копирование данных.

 public boolean unzip(String zipfilepath, String destinationdir) { try { FileInputStream fis = new FileInputStream(zipfilepath); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { System.out.println("Unzipping: " + entry.getName()); int size; byte[] buffer = new byte[2048]; FileOutputStream fos = new FileOutputStream(destinationdir+ "/" + entry.getName()); BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length); while ((size = zis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, size); } bos.flush(); bos.close(); } zis.close(); fis.close(); return true; }catch(Exception e){ return false; } } String zipfilepath = context.getFilesDir().getPath()+"/"+myfile.zip; String destinationdir = context.getFilesDir().getPath(); unzip(zipfilepath, destinationdir);