Pregunta Descomprime un archivo comprimido en una tarjeta SD en la aplicación Android


Tengo una contraseña comprimida protegida con un archivo de video guardado en una 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 por adelantado


15
2017-10-08 14:29


origen


Respuestas:


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 tu caso::

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

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

21
2017-10-08 14:34



Para desempacar el archivo protegido con contraseña, use esta biblioteca:

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

es demasiado fácil.

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

5
2017-12-14 12:36



Esta es una versión un poco más limpia del código de Samir con el uso de Apache IOUtils.copy() para copiar archivos y finally bloquear. Si tiene archivos grandes en archivo, entonces mejor uso 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");
        }
    }
}

2
2017-08-29 15:01



Otras respuestas realmente no funcionan en sdcard (Environment.getExternalStorageDirectory ()! = SDCARD) en kitkat y superior. ¡pero puedes usar este código para api 21 y superior! para obtener más ayuda para obtener zipDocumentFile leer esta :

/**
 * @return true->successful
 */
public static Boolean unzip(Context context, DocumentFile zipDocumentFile) {

    try {

        InputStream inputStream = context.getContentResolver().openInputStream(zipDocumentFile.getUri());
        assert inputStream != null;
        ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(inputStream, BUFFER_SIZE));

        ZipEntry ze;
        while ((ze = zipInputStream.getNextEntry()) != null) {
            if (ze.isDirectory()) {

                String[] paths = ze.getName().split("/");

                DocumentFile documentFile = null;
                for (String path : paths) {
                    if (documentFile == null) {
                        documentFile = zipDocumentFile.getParentFile().findFile(path);
                        if (documentFile == null)
                            documentFile = zipDocumentFile.getParentFile().createDirectory(path);
                    } else {
                        DocumentFile newDocumentFile = documentFile.findFile(path);
                        if (newDocumentFile == null) {
                            documentFile = documentFile.createDirectory(path);
                        } else {
                            documentFile = newDocumentFile;
                        }
                    }
                }

                if (documentFile == null || !documentFile.exists())
                    return false;

            } else {

                String[] paths = ze.getName().split("/");

                //Make Folders
                DocumentFile documentFile = null;
                for (int i = 0; i < paths.length - 1; i++) {
                    if (documentFile == null) {
                        documentFile = zipDocumentFile.getParentFile().findFile(paths[i]);
                        if (documentFile == null)
                            documentFile = zipDocumentFile.getParentFile().createDirectory(paths[i]);
                    } else {
                        DocumentFile newDocumentFile = documentFile.findFile(paths[i]);
                        if (newDocumentFile == null) {
                            documentFile = documentFile.createDirectory(paths[i]);
                        } else {
                            documentFile = newDocumentFile;
                        }
                    }
                }

                DocumentFile unzipDocumentFile;
                if (documentFile == null) {
                    unzipDocumentFile = zipDocumentFile.getParentFile().createFile(URLConnection.guessContentTypeFromName(ze.getName()), paths[paths.length - 1]);
                } else {
                    unzipDocumentFile = documentFile.createFile(URLConnection.guessContentTypeFromName(ze.getName()), paths[paths.length - 1]);

                }


                // unzip the file
                OutputStream outputStream = context.getContentResolver().openOutputStream(unzipDocumentFile.getUri());

                int read;
                byte[] data = new byte[BUFFER_SIZE];
                assert outputStream != null;
                while ((read = zipInputStream.read(data, 0, BUFFER_SIZE)) != -1)
                    outputStream.write(data, 0, read);

                zipInputStream.closeEntry();

            }
        }

        return true;

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }

}

0
2017-07-26 05:56