2012-07-23 14 views
12

Estoy leyendo archivos de un archivo ZIP que está ubicado en mi carpeta de activos Android usando ZipInputStream: funciona, pero es muy lento, ya que tiene que leerlo secuencialmente usando getNextEntry() , y hay bastantes archivos.Leyendo archivos desde un archivo ZIP en su carpeta de activos Android

Si copio el archivo ZIP en la tarjeta SD, la lectura es muy rápida cuando uso ZipFile.getEntry, ¡pero no encontré la manera de usar ZipFile con el archivo de activos!

¿Hay alguna forma de acceder al ZIP en la carpeta de activos de forma rápida? ¿O realmente tengo que copiar el ZIP a la tarjeta SD?

(Por cierto, en caso de que alguien se pregunte por qué estoy haciendo esto: la aplicación tiene más de 50 MB, por lo que para poder acceder a la Play Store debo usar los APK de expansión; sin embargo, esta aplicación también ser puesto en Amazon App Store, tengo que usar otra versión para esto, ya que Amazon no admite los APK de Expansión, naturalmente ... pensé que acceder a un archivo ZIP en dos ubicaciones diferentes sería una manera fácil de manejar esto, pero por desgracia ...)

Respuesta

2

Se puede crear un ZipInputStream de la siguiente manera:

ZipInputStream zipIs = new ZipInputStream(context.getResources().openRawResource(your.package.com.R.raw.filename)); 
ZipEntry ze = null; 

     while ((ze = zipIs.getNextEntry()) != null) { 

      FileOutputStream fout = new FileOutputStream(FOLDER_NAME +"/"+ ze.getName()); 

      byte[] buffer = new byte[1024]; 
      int length = 0; 

      while ((length = zipIs.read(buffer))>0) { 
      fout.write(buffer, 0, length); 
      } 
      zipIs .closeEntry(); 
      fout.close(); 
     } 
     zipIs .close(); 
+0

Gracias, pero como he escrito, que ya utilizan un 'ZipInputStream', pero buscando en la postal usando' getNextEntry() 'es simplemente demasiado lento! – hdort

+0

¿Lees el archivo con un buffer? Proporcioné mi código con un ejemplo. Funciona muy bien para mí. – Slickelito

+1

No es la extracción lenta, está buscando el archivo correcto en el archivo zip. ¿Hay algo similar como 'ZipFile.getEntry (filename)' para 'ZipInputStream'? – hdort

2

puede almacenar los archivos sin comprimir directamente en los activos (es decir, descomprimir el zip en activos/carpeta). De esta forma, puede acceder a los archivos directamente y se los comprimirá de todos modos al compilar el APK.

4

Esto funciona para mí:

private void loadzip(String folder, InputStream inputStream) throws IOException 
{ 
    ZipInputStream zipIs = new ZipInputStream(inputStream); 
    ZipEntry ze = null; 

      while ((ze = zipIs.getNextEntry()) != null) { 

       FileOutputStream fout = new FileOutputStream(folder +"/"+ ze.getName()); 

       byte[] buffer = new byte[1024]; 
       int length = 0; 

       while ((length = zipIs.read(buffer))>0) { 
       fout.write(buffer, 0, length); 
       } 
       zipIs.closeEntry(); 
       fout.close(); 
      } 
      zipIs.close(); 
} 
Cuestiones relacionadas