ZipUtils.java 2.8 KB
package com.polysoft.nafmii.utils;

import android.text.TextUtils;

import com.whaty.nafmii.BuildConfig;

import java.io.File;
import java.io.FileInputStream;
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 unZipDistAssets() {
        String unzipKeyFlag = BuildConfig.UNZIP_KEY;
        boolean isUnzip = SpUtils.getBoolean(unzipKeyFlag, true);
        if (isUnzip) {
            FileUtils.deletes(FileUtils.getDistDir());
        }
        // 已经存在,则不解压 或者 线上版本不需要解压
        if (FileUtils.getIndex().exists() || BuildConfig.ONLINE) {
            return;
        }
        File distDir = FileUtils.getDistDir().getParentFile();
        InputStream is = null;
        try {
            String distpath = "dist.zip";
            if (!TextUtils.isEmpty(BuildConfig.ASSETS_DIST_DIR)) {
                distpath = String.format("%s/%s", BuildConfig.ASSETS_DIST_DIR, distpath);
            }
            is = CtxUtils.openAssetsFile(distpath);
            unZip(is, distDir);
            SpUtils.putBoolean(unzipKeyFlag, false);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.close(is);
        }
    }


    public static void unZip(File zipFile, File outDir) throws Exception {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(zipFile);
            unZip(fis, outDir);
        } catch (Exception e) {
            throw e;
        } finally {
            IOUtils.close(fis);
        }
    }

    public static void unZip(InputStream is, File outDir) throws Exception {
        ZipInputStream zis = new ZipInputStream(is);
        ZipEntry entry = null;
        while (null != (entry = zis.getNextEntry())) {
            unZipEntry(zis, entry, outDir);
        }
    }

    private static void unZipEntry(ZipInputStream zis, ZipEntry entry, File outDir) throws Exception {
        String entryName = entry.getName();
        if (entry.isDirectory()) {
            File file = new File(outDir, entryName);
            file.mkdirs();
            return;
        }

        File file = new File(outDir, entryName);
        if (file.exists()) {
            file.delete();
        }
        FileOutputStream fos = null;
        try {
            file.createNewFile();
            fos = new FileOutputStream(file);
            byte[] buffer = new byte[4096];
            int len = -1;
            while ((len = zis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
                fos.flush();
            }
        } catch (IOException e) {
            throw new Exception("文件解压失败");
        } finally {
            IOUtils.close(fos);
        }
    }
}