2011-02-16 14 views
6

Necesito descomprimir un archivo .zip de 2.5mb (1087 archivos - * .html, * .css y * .db) en android, tengo usé java.util.zip, funciona bien, pero necesito mejorar el rendimiento, el proceso de descompresión dura 1,10 minutos, necesito reducir esta vez. he seguido algunas recomendaciones para mejorar el rendimiento, por ejemplo:Descomprimir archivos de una manera más rápida que usando java.util.zip en Android

  • Uso BufferedInputStream, FileOutputStream y BufferedOutputStream.
  • Leer la cremallera en bloques:

datos byte [] = new byte [2048]; while ((counter = bisMediaFile.read (data, 0, 2048))! = -1) { bosMediaFile.write (data, 0, counter); }

¿Hay alguna forma de mejorar mi código? Estaba buscando programas zip de terceros para usar programáticamente, por ejemplo, probé el 7ZipJBinding, pero parece que Android no es compatible con esto, porque hice referencia a los sevenzipjbinding.jar y sevenzipjbinding-AllPlatforms.jar pero me sale un error: "Native Bibliotecas detectadas en sevenzipjbinding-AllPlatforms ". En la página de inicio 7zip hay versiones para MAC, Windows, Linux, pero no vi nada sobre Android. ¿Podría recomendar alguna otra biblioteca para descomprimir archivos en Android?

Ésta es mi todo el código:

public static void processZipFile(String strBinaryPath,String strExtractPath, String strDestinationDBPath) throws Exception 
{ 
    ZipFile zipInFile = null; 
    try 
    { 
     if (strExtractPath != null) 
     { 
      zipInFile = new ZipFile(strBinaryPath); 
      for (Enumeration<? extends ZipEntry> entries = zipInFile.entries(); entries.hasMoreElements();) 
      { 
       ZipEntry zipMediaEntry = entries.nextElement(); 
       if (zipMediaEntry.isDirectory()) 
       { 
        File mediaDir = new File(String.format("%s\\%s", strExtractPath, zipMediaEntry.getName())); 
        mediaDir.mkdirs(); 
       } 
       else 
       { 
         BufferedInputStream bisMediaFile = null; 
         FileOutputStream fosMediaFile = null; 
         BufferedOutputStream bosMediaFile = null; 
         try 
         { 
           String strFileName = String.format("%s\\%s", strExtractPath, zipMediaEntry.getName()); 
           File uncompressDir = new File(strFileName).getParentFile(); 
           uncompressDir.mkdirs(); 

           //if is a database file, extract to other path : android.movinginteractive.com/databases 
           if(strFileName.contains(".db")) 
            strFileName = String.format("%s\\%s", strDestinationDBPath, ExtractDBName(zipMediaEntry.getName())); 

           bisMediaFile = new BufferedInputStream(zipInFile.getInputStream(zipMediaEntry)); 
           fosMediaFile = new FileOutputStream(strFileName); 
           bosMediaFile = new BufferedOutputStream(fosMediaFile); 

           int counter; 
           byte data[] = new byte[2048]; 

           while ((counter = bisMediaFile.read(data, 0, 2048)) != -1) 
           { 
            bosMediaFile.write(data, 0, counter); 
           } 
         } 
         catch (Exception ex) 
         { 
          throw ex; 
         } 
         finally 
         { 
          if (bosMediaFile != null) 
          { 
           bosMediaFile.flush(); 
           bosMediaFile.close(); 
          } 
          if (bisMediaFile != null) 
           bisMediaFile.close(); 
         } 
       } 
      } 


     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     if (zipInFile != null) 
      zipInFile.close(); 
     File flZipToDelete = new File(strBinaryPath); 
     if(flZipToDelete.exists()) 
      flZipToDelete.delete(); 

    } 
} 
+0

Debe perfilar/programar su código para ver dónde se gasta el tiempo. Puede usar 7zip o descomprimir Info-ZIP como referencia para ver qué tan rápido debe hacerse una implementación razonable. –

+0

1087 es una gran cantidad de archivos, ¿podría ser ese el problema? también, ¿lo intentaste con un buffer más grande? – bigstones

+0

Ok Gracias, voy a probar las sugerencias y después voy a comentar sobre esto. Muchas gracias – Jhon

Respuesta

0

Estoy seguro de que podría encontrar una C o C++ fragmento de código para descomprimir los archivos y ejecutarlo a través de la NDK de Android. Dicho esto, no estoy seguro de qué mejoras de rendimiento obtendrás.

Cuestiones relacionadas