¿Cómo acelerar el tiempo de descompresión en Java/Android?

Resuelto digitalWestie asked hace 54 años • 6 respuestas

Descomprimir archivos en Android parece ser terriblemente lento. Al principio pensé que era sólo el emulador, pero parece ser lo mismo en el teléfono. Probé diferentes niveles de compresión y finalmente bajé al modo de almacenamiento, pero todavía lleva mucho tiempo.

De todos modos, ¡debe haber una razón! ¿Alguien más tiene este problema? Mi método de descomprimir se ve así:

public void unzip()
{
try{
        FileInputStream fin = new FileInputStream(zipFile);
        ZipInputStream zin = new ZipInputStream(fin);
        File rootfolder = new File(directory);
        rootfolder.mkdirs();
        ZipEntry ze = null;
        while ((ze = zin.getNextEntry())!=null){

            if(ze.isDirectory()){
                dirChecker(ze.getName());
            }
            else{
                FileOutputStream fout = new FileOutputStream(directory+ze.getName());

            for(int c = zin.read();c!=-1;c=zin.read()){
                fout.write(c);
            }
                //Debug.out("Closing streams");
                zin.closeEntry();
                fout.close();

        }
    }
    zin.close();
}
catch(Exception e){
            //Debug.out("Error trying to unzip file " + zipFile);

}
    }
digitalWestie avatar Jan 01 '70 08:01 digitalWestie
Aceptado

No sé si descomprimir en Android es lento, pero copiar byte a byte en bucle seguramente lo ralentiza aún más. Intente usar BufferedInputStream y BufferedOutputStream; puede que sea un poco más complicado, pero en mi experiencia, al final vale la pena.

BufferedInputStream in = new BufferedInputStream(zin);
BufferedOutputStream out = new BufferedOutputStream(fout);

Y luego puedes escribir con algo como esto:

byte b[] = new byte[1024];
int n;
while ((n = in.read(b,0,1024)) >= 0) {
  out.write(b,0,n);
}
Robert Kolner avatar Dec 21 '2010 22:12 Robert Kolner

Gracias por la solución Roberto. Modifiqué mi método de descompresión y ahora solo toma unos segundos en lugar de 2 minutos. Quizás alguien esté interesado en mi solución. Así que aquí tienes:

public void unzip() {

    try {
        FileInputStream inputStream = new FileInputStream(filePath);
        ZipInputStream zipStream = new ZipInputStream(inputStream);
        ZipEntry zEntry = null;
        while ((zEntry = zipStream.getNextEntry()) != null) {
            Log.d("Unzip", "Unzipping " + zEntry.getName() + " at "
                    + destination);

            if (zEntry.isDirectory()) {
                hanldeDirectory(zEntry.getName());
            } else {
                FileOutputStream fout = new FileOutputStream(
                        this.destination + "/" + zEntry.getName());
                BufferedOutputStream bufout = new BufferedOutputStream(fout);
                byte[] buffer = new byte[1024];
                int read = 0;
                while ((read = zipStream.read(buffer)) != -1) {
                    bufout.write(buffer, 0, read);
                }

                zipStream.closeEntry();
                bufout.close();
                fout.close();
            }
        }
        zipStream.close();
        Log.d("Unzip", "Unzipping complete. path :  " + destination);
    } catch (Exception e) {
        Log.d("Unzip", "Unzipping failed");
        e.printStackTrace();
    }

}

public void hanldeDirectory(String dir) {
        File f = new File(this.destination + dir);
        if (!f.isDirectory()) {
            f.mkdirs();
        }
}
Thomas Krex avatar Jan 16 '2014 10:01 Thomas Krex