2011-10-08 14 views
16

Tengo una contraseña comprimida protegida con un archivo de video guardado en la tarjeta SD en el emulador de Android. Ahora quiero descomprimir ese archivo de video en una tarjeta sd a través del código. ¿Cómo puedo lograr eso? Cualquier ayuda o código? Gracias de antemanoDescomprimir un archivo comprimido en la tarjeta SD en la aplicación Android

+0

http://www.google.com/search?q=android+unzip+file – Caner

+0

un vistazo a ZipInputStream desde el sitio de desarrolladores de Android: http://developer.android.com/reference/java /util/zip/ZipFile.html – Seph

+1

Esta pregunta se ha hecho muchas veces antes. Está en la biblioteca de Java en lugar de la de Android. Vea aquí: http://stackoverflow.com/questions/3382996/how-to-unzip-files-programmatically-in-android – HXCaine

Respuesta

21
import android.util.Log; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

/** 
* 
* @author jon 
*/ 
public class Decompress { 
    private String _zipFile; 
    private String _location; 

    public Decompress(String zipFile, String location) { 
    _zipFile = zipFile; 
    _location = location; 

    _dirChecker(""); 
    } 

    public void unzip() { 
    try { 
     FileInputStream fin = new FileInputStream(_zipFile); 
     ZipInputStream zin = new ZipInputStream(fin); 
     ZipEntry ze = null; 
     while ((ze = zin.getNextEntry()) != null) { 
     Log.v("Decompress", "Unzipping " + ze.getName()); 

     if(ze.isDirectory()) { 
      _dirChecker(ze.getName()); 
     } else { 
      FileOutputStream fout = new FileOutputStream(_location + ze.getName()); 
      for (int c = zin.read(); c != -1; c = zin.read()) { 
      fout.write(c); 
      } 

      zin.closeEntry(); 
      fout.close(); 
     } 

     } 
     zin.close(); 
    } catch(Exception e) { 
     Log.e("Decompress", "unzip", e); 
    } 

    } 

    private void _dirChecker(String dir) { 
    File f = new File(_location + dir); 

    if(!f.isDirectory()) { 
     f.mkdirs(); 
    } 
    } 
} 

En su caso ::

String zipFilename = Environment.getExternalStorageDirectory() + "/files.zip"; 
String unzipLocation = Environment.getExternalStorageDirectory() + "/unzipped/"; 

Decompress d = new Decompress(zipFilename, unzipLocation); 
d.unzip(); 
+0

hola esta página muestra "la página no existe" –

+2

Divyesh Gracias por su respuesta. Pero todavía estoy confundido porque mi archivo comprimido está protegido por contraseña, así que ¿cómo voy a coincidir con esa contraseña para ingresar en el archivo? –

+13

Simplemente como un complemento a su respuesta, la lectura de entrada real y la escritura de archivo se pueden hacer en fragmentos para un rendimiento mucho más alto en lugar de byte por byte: 'byte [] buffer = new byte [4096]; for (int c = zin.read (buffer); c! = -1; c = zin.read (buffer)) { fout.write (buffer, 0, c); } ' – nobre

2

Esto es un poco más versión más limpia de código de Samir con el uso de Apache de IOUtils.copy() para la copia de archivos y finally bloque. Si tiene archivos grandes en archivo, mejor use IOUtils.copyLarge().

import org.apache.commons.io.IOUtils; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

public class ZipUtils { 
    public static void unzip(InputStream is, File path) { 
     checkDir(path); 
     ZipInputStream zis = null; 
     FileOutputStream fos = null; 
     try { 
      zis = new ZipInputStream(is); 
      ZipEntry ze; 
      while ((ze = zis.getNextEntry()) != null) { 
       File entryFile = new File(path, ze.getName()); 
       if (ze.isDirectory()) { 
        checkDir(entryFile); 
       } else { 
        fos = new FileOutputStream(entryFile); 
        IOUtils.copy(zis, fos); 
        fos.close(); 
        fos = null; 
       } 
       zis.closeEntry(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (zis != null) { 
       try { 
        zis.close(); 
       } catch (IOException ignore) { 
       } 
      } 
      if (fos != null) { 
       try { 
        fos.close(); 
       } catch (IOException ignore) { 
       } 
      } 
     } 
    } 

    private static void checkDir(File path) { 
     if (!path.exists()) { 
      path.mkdirs(); 
     } else if (!path.isDirectory()) { 
      throw new IllegalArgumentException("Path is not directory"); 
     } 
    } 
} 
5

Para desempaquetar el archivo protegido con contraseña el uso de esta biblioteca:

http://www.lingala.net/zip4j/download.php

es tan fácil.

ZipFile zipFile = new ZipFile(YourZipFile); 
if(zipFile.isEncrypted()) 
    zipFile.setPassword(Password); 
zipFile.extractAll(Destination); 
Cuestiones relacionadas