How to zip and unzip the files? How to zip and unzip the files? android android

How to zip and unzip the files?


Take a look at java.util.zip.* classes for zip functionality. I've done some basic zip/unzip code, which I've pasted below. Hope it helps.

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


The zip function brianestey provided works well, but the unzip function is very slow due to reading one byte at a time. Here is a modified version of his unzip function that utilizes a buffer and is much faster.

/** * 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);    }}


Using File instead of the file path String.

This answer is based off of @brianestey's excellent answer.

I have modified his zip method to accept a list of Files instead of file paths and an output zip File instead of a filepath, which might be helpful to others if that's what they're dealing with.

public static void zip( List<File> files, File zipFile ) throws IOException {    final int BUFFER_SIZE = 2048;    BufferedInputStream origin = null;    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));    try {        byte data[] = new byte[BUFFER_SIZE];        for ( File file : files ) {            FileInputStream fileInputStream = new FileInputStream( file );            origin = new BufferedInputStream(fileInputStream, BUFFER_SIZE);            String filePath = file.getAbsolutePath();            try {                ZipEntry entry = new ZipEntry( filePath.substring( filePath.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();    }}