net example comprimir archivos android file zip limits

android - example - ziparchive c#



Android 3.x+Java ZipFile Class-No se pueden leer ZipEntries de archivos grandes (3)

Si abro un archivo zip grande (250 MB) a través de la clase ZipFile e intento leer las entradas. Esto funciona bien en 2.x en el emulador y hardware real. Si utilizo el código exacto de mi tableta (Asus Transformer que ejecuta 4.0.3) o el emulador (3.2), no puedo leer ninguna entrada. La función size () de la clase ZipFile siempre devuelve cero y ZipFile no devuelve ninguna entrada zip. Incluso la aplicación zip que viene con la ROM en mi tableta no puede leer ninguna entrada. El archivo zip no está dañado. Yo lo revisé.

El código para leer de ZipFile funciona bien en todas las versiones con archivos zip más pequeños. ¿Qué ha cambiado entre 2.x y 3.x / 4.x?

My Testfile es el archivo C64Music.zip de la colección de HighVoltage Sid. Contiene más de 40.000 archivos y es de alrededor de 250MB.

No tengo ni idea de dónde mirar.


Este es un problema conocido con la implementación de ZipFile en Android:

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

Básicamente, los archivos zip solo admiten hasta 65k entradas. Existe una versión extendida del formato de archivo zip llamado Zip64, que admite un mayor número de entradas. Desafortunadamente, ZipFile en Android no puede leer Zip64. Probablemente encontrará que el archivo C64Music.zip está en formato Zip64

Una solución alternativa es utilizar la biblioteca Compress de Apache Commons en lugar de la implementación nativa. Su versión de ZipFile admite Zip64: http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html


Se hicieron muchos cambios en 3.x / 4.x para evitar el abuso contra el hilo de la interfaz de usuario. Por lo tanto, es posible que su aplicación se bloquee porque no está descargando la costosa operación de E / S del disco a un Thread separado.


public class Compress { private static final int BUFFER = 2048; private String[] _files; private String _zipFile; public Compress(String[] files, String zipFile) { _files = files; _zipFile = zipFile; } public void zip() { try { BufferedInputStream origin = null; FileOutputStream dest = new FileOutputStream(_zipFile); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); byte data[] = new byte[BUFFER]; for(int i=0; i < _files.length; i++) { Log.v("Compress", "Adding: " + _files[i]); FileInputStream fi = new FileInputStream(_files[i]); origin = new BufferedInputStream(fi, BUFFER); ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1)); out.putNextEntry(entry); int count; while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } origin.close(); } out.close(); } catch(Exception e) { e.printStackTrace(); } } } Call Compress like given below where you want to zip a file :---- String zipFilePath = "fileName.zip"; File zipFile = new File(zipFilePath); String[] files = new String[] {"/sdcard/fileName"}; if(!zipFile.exists()){ new Compress(files, zipFilePath).zip(); }