2011-09-20 13 views
25

Cómo comprimir y descomprimir los archivos que ya están en DDMS: data/data/mypackage/files/ Necesito un ejemplo simple para eso. Ya he buscado relacionado a comprimir y descomprimir. Pero, no hay un solo ejemplo disponible para mí. ¿Alguien puede decir algo de ejemplo? Gracias anticipadas.Cómo comprimir y descomprimir los archivos?

+1

Echa un vistazo aquí: http://www.jondev.net/articles/Zipping_Files_with_Android_(Programmatically), en la primera página en la búsqueda de "androide cómo los archivos zip" en Google. – nhaarman

Respuesta

55

Eche un vistazo a las clases java.util.zip. * Para la funcionalidad de zip. He hecho un código zip/descomprimir básico, que he pegado a continuación. Espero eso ayude.

public static void zip(String[] files, String zipFile) throws IOException { 
    BufferedInputStream origin = null; 
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); 
    try { 
     byte data[] = new byte[BUFFER_SIZE]; 

     for (int i = 0; i < files.length; i++) { 
      FileInputStream fi = new FileInputStream(files[i]);  
      origin = new BufferedInputStream(fi, BUFFER_SIZE); 
      try { 
       ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1)); 
       out.putNextEntry(entry); 
       int count; 
       while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) { 
        out.write(data, 0, count); 
       } 
      } 
      finally { 
       origin.close(); 
      } 
     } 
    } 
    finally { 
     out.close(); 
    } 
} 

public static void unzip(String zipFile, String location) throws IOException { 
    try { 
     File f = new File(location); 
     if(!f.isDirectory()) { 
      f.mkdirs(); 
     } 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile)); 
     try { 
      ZipEntry ze = null; 
      while ((ze = zin.getNextEntry()) != null) { 
       String path = location + ze.getName(); 

       if (ze.isDirectory()) { 
        File unzipFile = new File(path); 
        if(!unzipFile.isDirectory()) { 
         unzipFile.mkdirs(); 
        } 
       } 
       else { 
        FileOutputStream fout = new FileOutputStream(path, false); 
        try { 
         for (int c = zin.read(); c != -1; c = zin.read()) { 
          fout.write(c); 
         } 
         zin.closeEntry(); 
        } 
        finally { 
         fout.close(); 
        } 
       } 
      } 
     } 
     finally { 
      zin.close(); 
     } 
    } 
    catch (Exception e) { 
     Log.e(TAG, "Unzip exception", e); 
    } 
} 
+0

No funciona para mí. Se pega en un bucle infinito. – usman

+0

Esto está mal: 'String path = location + ze.getName(); if (ze.isDirectory()) { Archivo unzipFile = new File (path); if (! UnzipFile.isDirectory()) { unzipFile.mkdirs(); } } ' – maohieng

+0

¿Cuál debería ser el valor de la variable de tamaño de búfer? –

45

La función brianestey postal proporcionó funciona bien, pero la función de descompresión es muy lento debido a la lectura de un byte a la vez. Aquí hay una versión modificada de su función de descompresión que utiliza un buffer y es mucho más rápido.

/** 
* Unzip a zip file. Will overwrite existing files. 
* 
* @param zipFile Full path of the zip file you'd like to unzip. 
* @param location Full path of the directory you'd like to unzip to (will be created if it doesn't exist). 
* @throws IOException 
*/ 
public static void unzip(String zipFile, String location) throws IOException { 
    int size; 
    byte[] buffer = new byte[BUFFER_SIZE]; 

    try { 
     if (!location.endsWith(File.separator)) { 
      location += File.separator; 
     } 
     File f = new File(location); 
     if(!f.isDirectory()) { 
      f.mkdirs(); 
     } 
     ZipInputStream zin = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE)); 
     try { 
      ZipEntry ze = null; 
      while ((ze = zin.getNextEntry()) != null) { 
       String path = location + ze.getName(); 
       File unzipFile = new File(path); 

       if (ze.isDirectory()) { 
        if(!unzipFile.isDirectory()) { 
         unzipFile.mkdirs(); 
        } 
       } else { 
        // check for and create parent directories if they don't exist 
        File parentDir = unzipFile.getParentFile(); 
        if (null != parentDir) { 
         if (!parentDir.isDirectory()) { 
          parentDir.mkdirs(); 
         } 
        } 

        // unzip the file 
        FileOutputStream out = new FileOutputStream(unzipFile, false); 
        BufferedOutputStream fout = new BufferedOutputStream(out, BUFFER_SIZE); 
        try { 
         while ((size = zin.read(buffer, 0, BUFFER_SIZE)) != -1) { 
          fout.write(buffer, 0, size); 
         } 

         zin.closeEntry(); 
        } 
        finally { 
         fout.flush(); 
         fout.close(); 
        } 
       } 
      } 
     } 
     finally { 
      zin.close(); 
     } 
    } 
    catch (Exception e) { 
     Log.e(TAG, "Unzip exception", e); 
    } 
} 
+2

Este descomprimir no funcionó para mí. Recibía errores porque estaba intentando descomprimir un archivo antes de su directorio padre. En la declaración else, agregué una condición para crear el directorio principal si no existe. Ahora eso funciona –

+0

@ J-L Gracias por señalar eso. He editado el código en consecuencia. – Ben

+0

rápido y trabajo gr8, mi BUFFER_SIZE = 8192 –

Cuestiones relacionadas