Android压缩包下载解压

使用说明:在需要处理大文件下载,为了节省流量就在后台做成了压缩包,app端联网下载到本地解压使用;

使用步骤:

1 联网下载

 在下使用的是okGo,此框架比Retrufit还简单,为什么不用呢。

 okGo下载文件和下载其他是不一样的联网方法:

OkGo.post(Constants.HEART_URL + drawingUrl)
        .tag(this)
        .connTimeOut(30000)
        .params("conditionParam", "")
        .isMultipart(true)
        .execute(fileCallback);
 看出来了吧,不一致的地方.execute(FileCallback)

 FileCallBack的常用方法:

/**
 * 下载zip文件的回调
 */
public FileCallback fileCallback = new FileCallback() {
    @Override
    public void onSuccess(File file, okhttp3.Call call, okhttp3.Response response) {
        ToastUtil.showToast("文件下载成功");
       
    }

    @Override
    public void onBefore(BaseRequest request) {
        cancelProgressDialog();
    }

    @Override
    public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
        LogUtil.e("下载进度currentSize:" + currentSize + "  totalSize:" + totalSize + "   progress:" + progress + "   networkSpeed:" + networkSpeed);
        int answer = (int) ((progress*100)/1);
        showProgressDialog("正在下载图纸"+ answer + "%");
    }

    @Override
    public void onAfter(File file, Exception e) {
        cancelProgressDialog();
    }

    @Override
    public void onError(okhttp3.Call call, okhttp3.Response response, Exception e) {
        cancelProgressDialog();
        ToastUtil.showToast("下载失败" + e.getMessage());
    }
};
关于用法,请直接百度下。这里需要详细解释用法的是解压:

扫描二维码关注公众号,回复: 1744302 查看本文章

2 在下载成功的回调fileCallBack的onSucess()方法里调用自定义工具类直接解压,

解压工具类:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * Created by sensyang on 2018/1/5.
 * @author: 一个人的暗
 * @Emial:[email protected]
 */

public class ZipUtil {

    public static ZipUtil instance;

    public static ZipUtil getInstance(){
        if (instance == null) {
            instance = new ZipUtil();
        }
        return instance;
    }

    /**
     * 解压
     * @param PATH    解压到的地址
     * @param zipName  zip文件
     */

    public boolean unZip(String PATH,String zipName) {
        boolean isOver = true;
        File file = new File(zipName);
        LogUtil.e("进入解压");
        try {
            upZipFile(file, PATH);
            // upZipFile(zip文件,解压到的地址);
        } catch (IOException e) {
            e.printStackTrace();
            isOver = false;
            ToastUtil.showToast("解压失败"+ e.getMessage());
        }
        return isOver;
    }

    /**
     * 解压缩
     * 将zipFile文件解压到folderPath目录下.
     * @param zipFile zip文件
     * @param folderPath 解压到的地址
     * @throws IOException
     */
    private void upZipFile(File zipFile, String folderPath) throws IOException {
        ZipFile zfile = new ZipFile(zipFile);
        Enumeration zList = zfile.entries();
        ZipEntry ze = null;
        byte[] buf = new byte[1024];
        while (zList.hasMoreElements()) {
            ze = (ZipEntry) zList.nextElement();
            if (ze.isDirectory()) {
                String dirstr = folderPath + ze.getName();
                dirstr = new String(dirstr.getBytes("8859_1"), "GB2312");
                File f = new File(dirstr);
                f.mkdir();
                continue;
            }
            OutputStream os = new BufferedOutputStream(new FileOutputStream(getRealFileName(folderPath, ze.getName())));
            InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
            int readLen = 0;
            while ((readLen = is.read(buf, 0, 1024)) != -1) {
                os.write(buf, 0, readLen);
            }
            is.close();
            os.close();
        }
        zfile.close();
    }

    /**
     * 给定根目录,返回一个相对路径所对应的实际文件名.
     * @param baseDir     指定根目录
     * @param absFileName 相对路径名,来自于ZipEntry中的name
     * @return java.io.File 实际的文件
     */
    public File getRealFileName(String baseDir, String absFileName) {
        String[] dirs = absFileName.split("/");
        File ret = new File(baseDir);
        String substr = null;
        if (dirs.length > 1) {
            for (int i = 0; i < dirs.length - 1; i++) {
                substr = dirs[i];
                try {
                    substr = new String(substr.getBytes("8859_1"), "GB2312");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                ret = new File(ret, substr);

            }
            if (!ret.exists()) {
                ret.mkdirs();
            }
            substr = dirs[dirs.length - 1];
            try {
                substr = new String(substr.getBytes("8859_1"), "GB2312");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            ret = new File(ret, substr);
            LogUtil.e("解压后的路径1:"+ ret.getAbsolutePath());
            return ret;
        }
        return ret;
    }

}

调用方法:

String dirName = Environment.getExternalStorageDirectory() + "/YaRui/";
File f = new File(dirName);
//不存在创建
if (!f.exists()) {
    f.mkdir();
}
ZipUtil.getInstance().unZip(f.getAbsolutePath(),file.getAbsolutePath());

所有代码亲测有用,有问题请咨询:

532245792 一个人的暗,谢谢。(也是转自前辈的,但是看的太多了,到底是说的?)

猜你喜欢

转载自blog.csdn.net/csdn_loveqingqing/article/details/79002978