开发者

Unzip a zipped file on sd card in Android application

I have a zipped password protected a video file saved on sd ca开发者_开发百科rd on android emulator. Now i want to unzip that video file on sd card through code. How can i achieve that? Any help or code? Thanks in advance


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(); 
    } 
  } 
} 

In your case::

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

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


To unpacking the password protected file use this library:

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

it is so easy.

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


This is slightly more cleaner version of Samir's code with using Apache's IOUtils.copy() for copying files and finally block. If you have large files in archive then better 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");
        }
    }
}


Other answers not really work on sdcard(Environment.getExternalStorageDirectory() != SDCARD) in kitkat and above. but you can use this code for api 21 and above! for more help to get zipDocumentFile read this :

/**
 * @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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜