How to zip and unzip the files?

后端 未结 4 1352
攒了一身酷
攒了一身酷 2020-11-30 21:36

How to zip and unzip the files which are all already in DDMS : data/data/mypackage/files/ I need a simple example for that. I\'ve already search related to zip

相关标签:
4条回答
  • 2020-11-30 21:56

    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();
        }
    }
    
    0 讨论(0)
  • 2020-11-30 22:02

    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);
        }
    }
    
    0 讨论(0)
  • 2020-11-30 22:06

    This answer is based of brianestey, Ben, Giacomo Mattiuzzi, Joshua Pinter.

    Functions rewritten to Kotlin and added functions for working with Uri.

    import android.content.Context
    import android.net.Uri
    import java.io.*
    import java.util.zip.ZipEntry
    import java.util.zip.ZipInputStream
    import java.util.zip.ZipOutputStream
    
    private const val MODE_WRITE = "w"
    private const val MODE_READ = "r"
    
    fun zip(zipFile: File, files: List<File>) {
        ZipOutputStream(BufferedOutputStream(FileOutputStream(zipFile))).use { outStream ->
            zip(outStream, files)
        }
    }
    
    fun zip(context: Context, zipFile: Uri, files: List<File>) {
        context.contentResolver.openFileDescriptor(zipFile, MODE_WRITE).use { descriptor ->
            descriptor?.fileDescriptor?.let {
                ZipOutputStream(BufferedOutputStream(FileOutputStream(it))).use { outStream ->
                    zip(outStream, files)
                }
            }
        }
    }
    
    private fun zip(outStream: ZipOutputStream, files: List<File>) {
        files.forEach { file ->
            outStream.putNextEntry(ZipEntry(file.name))
            BufferedInputStream(FileInputStream(file)).use { inStream ->
                inStream.copyTo(outStream)
            }
        }
    }
    
    fun unzip(zipFile: File, location: File) {
        ZipInputStream(BufferedInputStream(FileInputStream(zipFile))).use { inStream ->
            unzip(inStream, location)
        }
    }
    
    fun unzip(context: Context, zipFile: Uri, location: File) {
        context.contentResolver.openFileDescriptor(zipFile, MODE_READ).use { descriptor ->
            descriptor?.fileDescriptor?.let {
                ZipInputStream(BufferedInputStream(FileInputStream(it))).use { inStream ->
                    unzip(inStream, location)
                }
            }
        }
    }
    
    private fun unzip(inStream: ZipInputStream, location: File) {
        if (location.exists() && !location.isDirectory)
            throw IllegalStateException("Location file must be directory or not exist")
    
        if (!location.isDirectory) location.mkdirs()
    
        val locationPath = location.absolutePath.let {
            if (!it.endsWith(File.separator)) "$it${File.separator}"
            else it
        }
    
        var zipEntry: ZipEntry?
        var unzipFile: File
        var unzipParentDir: File?
    
        while (inStream.nextEntry.also { zipEntry = it } != null) {
            unzipFile = File(locationPath + zipEntry!!.name)
            if (zipEntry!!.isDirectory) {
                if (!unzipFile.isDirectory) unzipFile.mkdirs()
            } else {
                unzipParentDir = unzipFile.parentFile
                if (unzipParentDir != null && !unzipParentDir.isDirectory) {
                    unzipParentDir.mkdirs()
                }
                BufferedOutputStream(FileOutputStream(unzipFile)).use { outStream ->
                    inStream.copyTo(outStream)
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-30 22:16

    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);
        }
    }
    
    0 讨论(0)
提交回复
热议问题