Android

zip解压缩工具类

2020-02-22  本文已影响0人  明日未期
import android.os.Build;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipUtil {


    /**压缩文件及文件夹
     *@param srcFileName
     *@param zipFileName
     *@return
     */

    public static boolean toZip(String srcFileName, String zipFileName) {
        return toZip(new File(srcFileName), new File(zipFileName));
    }


    /**压缩文件及文件夹
     *@param srcFile
     *@param zipFile
     *@return
     */
    private static boolean toZip(File srcFile, File zipFile) {

        if (!zipFile.getParentFile().exists()) {
            zipFile.getParentFile().mkdirs();
        }
        ZipOutputStream zos = null;
        try {
            //创建zip输出流
            zos = new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(zipFile), new Adler32()));
            String basePath = srcFile.getName();
            String rootPath = basePath + File.separator;
            return compress(srcFile, zos, basePath, rootPath);

        } catch (Exception e) {
        } finally {
            if (zos != null) {
                try {
                    zos.close();
                } catch (IOException e) {}
            }
        }
        return false;
    }


    /**递归压缩 压缩文件及文件夹
     *@param srcFile
     *@param zos
     *@param basePath
     *@param rootPath
     *@return
     */
    private static boolean compress(File srcFile, ZipOutputStream zos, String basePath, String rootPath) {
        byte[] buffer = new byte[1024];
        basePath = basePath.replace(rootPath, "");

        try {
            if (srcFile.isDirectory()) {
                File[] fileList = srcFile.listFiles();
                if (fileList.length == 0) {
                    zos.putNextEntry(new ZipEntry(basePath + "/"));
                } else {
                    for (File file : fileList) {
                        compress(file, zos, basePath + File.separator + file.getName(), rootPath);
                    }
                }
            } else {
                zos.putNextEntry(new ZipEntry(basePath));
                FileInputStream fis = new FileInputStream(srcFile);
                int len;
                while ((len = fis.read(buffer)) != -1) {
                    zos.write(buffer, 0, len);
                    zos.flush();
                }
                zos.flush();
                zos.closeEntry();
                fis.close();

            }
            return true;
        } catch (Exception e) {}
        return false;
    }


    /**
     * 解压到指定目录
     */
    public static boolean unZipFiles(String zipPath, String descDir) {
        return unZipFiles(new File(zipPath), descDir);
    }
    /**
     * 解压文件到指定目录
     */
    private static boolean unZipFiles(File zipFile, String descDir) {
        if (!descDir.endsWith("/")) descDir = descDir + "/";
        //File pathFile = new File(descDir);
        try {

            //解决zip文件中有中文目录或者中文文件
            ZipFile zip = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) ?new ZipFile(zipFile, Charset.forName("GBK")): new ZipFile(zipFile);
            for (Enumeration entries = zip.entries(); entries.hasMoreElements();) {
                ZipEntry entry = (ZipEntry)entries.nextElement();
                String zipEntryName = entry.getName();
                InputStream in = zip.getInputStream(entry);
                String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
                //判断路径是否存在,不存在则创建文件路径
                File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
                if (!file.exists()) {
                    file.mkdirs();
                }
                //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
                if (new File(outPath).isDirectory()) {
                    continue;
                }
                //输出文件路径信息
                //System.out.println(outPath);
                OutputStream out = new FileOutputStream(outPath);
                byte[] buffer = new byte[1024];
                int len;
                while ((len = in.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
                in.close();
                out.flush();
                out.close();
            }
            return true;
        } catch (Exception e) {}
        return false;
    }


}
上一篇 下一篇

猜你喜欢

热点阅读