2012-03-30 9 views
21

Si abro un archivo zip grande (250MB) 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 uso exactamente algún código en mi tableta (Asus Transformer ejecutando 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é.Android 3.x + Java ZipFile Class - No se pueden leer ZipEntries desde archivos grandes

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 C64Music.zip de la Colección HighVoltage Sid. Contiene más de 40,000 archivos y tiene alrededor de 250MB.

No tengo ni idea de dónde mirar.

+0

¿Ha intentado leer otros archivos zip en su Asus o emulador ejecutando 3.x/4.x? ¿Es el problema solo con este archivo zip? –

+0

¿Está tragando alguna excepción? Si no, ¿getName() devuelve el nombre del archivo zip? (Prueba simple, pero podría aparecer algo sorprendente). ¿Obtiene resultados diferentes si abre el zip con o sin el indicador OPEN_READ? –

+0

No estoy seguro, ¿podrías probar con 'JarFile'? ... –

Respuesta

0
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(); 
    } 
0

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

2

Este es un problema conocido con la implementación ZipFile androide:

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

Básicamente archivos zip sólo admiten hasta 65 mil entradas. Hay una versión extendida del formato de archivo zip llamado Zip64, que admite una mayor cantidad de entradas. Desafortunadamente ZipFile en Android no puede leer Zip64. Probablemente descubrirá que el archivo C64Music.zip está en formato Zip64

Una alternativa es utilizar la biblioteca Apache Commons Compress 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

Cuestiones relacionadas