基于Android下载并解压Zip文件,更新UI简单帮助类

来源:互联网 发布:小米6怎么样知乎 编辑:程序博客网 时间:2024/04/19 09:13

类似于:http://blog.csdn.net/jarlen/article/details/44794031

下载文件:

/**     * 下载文件     *      * @param down_url     * @param output     * @param tmpDir     */    private void download(String down_url, File output, File tmpDir)    {        InputStream inputStream = null;        OutputStream outputStream = null;        File tmp = null;        int down_step = 1;// 提示step        int totalSize = 0;        int downloadCount = 0;// 已经下载好的大小        int updateCount = 0;// 已经上传的文件大小        try        {            tmp = File.createTempFile("download", ".tmp", tmpDir);            URL url = new URL(down_url);            HttpURLConnection httpURLConnection = (HttpURLConnection) url                    .openConnection();            httpURLConnection.setConnectTimeout(30 * 1000);            httpURLConnection.setReadTimeout(30 * 1000);            // 获取下载文件的size            totalSize = httpURLConnection.getContentLength();            inputStream = new URL(down_url).openStream();            outputStream = new BufferedOutputStream(new FileOutputStream(tmp));            byte[] buffer = new byte[BUFFER_SIZE];            int readsize = 0;            while ((readsize = inputStream.read(buffer)) != -1)            {                outputStream.write(buffer, 0, readsize);                downloadCount += readsize;// 时时获取下载到的大小                // 每次增长1%                if (updateCount == 0                        || (downloadCount * 100 / totalSize - down_step) >= updateCount)                {                    updateCount += down_step;                    sendMessage(DOWN_UPDATA, updateCount);                }            }            if (httpURLConnection != null)            {                httpURLConnection.disconnect();            }            tmp.renameTo(output);            tmp = null;        } catch (IOException e)        {            sendMessage(DOWN_ERROR, 0);            throw new RuntimeException(e);        } finally        {            try            {                if (tmp != null)                {                    tmp.delete();                    tmp = null;                }                if (inputStream != null)                {                    inputStream.close();                    inputStream = null;                }                if (outputStream != null)                {                    outputStream.close();                    outputStream = null;                }            } catch (Exception e2)            {                sendMessage(DOWN_ERROR, 0);            }            sendMessage(DOWN_FINISH, 0);        }    }

解压Zip文件

public class ZipUnPack {    private static final int BUFFER_SIZE = 8192;    private String _zipFile;    private String _location;    private byte[] _buffer;    /**     * Constructor.     *      * @param zipFile     *            Fully-qualified path to .zip file     * @param location     *            Fully-qualified path to folder where files should be written.     *            Path must have a trailing slash.     */    public ZipUnPack(String zipFile, String location) {        _zipFile = zipFile;        _location = location;        _buffer = new byte[BUFFER_SIZE];        dirChecker("");    }    public Boolean unzip() {        FileInputStream fin = null;        ZipInputStream zin = null;        OutputStream fout = null;        File outputDir = new File(_location);        File tmp = null;        Boolean isSucess = true;        try {            fin = new FileInputStream(_zipFile);            zin = new ZipInputStream(fin);            ZipEntry ze = null;            while ((ze = zin.getNextEntry()) != null) {                Log.d("Decompress", "Unzipping " + ze.getName());                if (ze.isDirectory()) {                    dirChecker(ze.getName());                } else {                    tmp = File.createTempFile("decomp", ".tmp", outputDir);                    fout = new BufferedOutputStream(new FileOutputStream(tmp));                    copyStream(zin, fout, _buffer, BUFFER_SIZE);                    zin.closeEntry();                    fout.close();                    fout = null;                    tmp.renameTo(new File(_location + ze.getName()));                    tmp = null;                }            }            zin.close();            zin = null;        } catch (IOException e) {            isSucess = false;            throw new RuntimeException(e);        } finally {            if (tmp != null) {                try {                    tmp.delete();                } catch (Exception ignore) {                }            }            if (fout != null) {                try {                    fout.close();                } catch (Exception ignore) {                    ;                }            }            if (zin != null) {                try {                    zin.closeEntry();                } catch (Exception ignore) {                    ;                }            }            if (fin != null) {                try {                    fin.close();                } catch (Exception ignore) {                    ;                }            }            isSucess = true;        }        return isSucess;    }    private void dirChecker(String dir) {        File f = new File(_location + dir);        if (!f.isDirectory()) {            f.mkdirs();        }    }    /**     * Copy from one stream to another. Throws IOException in the event of error     * (for example, SD card is full)     *      * @param is     *            Input stream.     * @param os     *            Output stream.     * @param buffer     *            Temporary buffer to use for copy.     * @param bufferSize     *            Size of temporary buffer, in bytes.     */    private void copyStream(InputStream is, OutputStream os,            byte[] buffer, int bufferSize) throws IOException {        try {            for (;;) {                int count = is.read(buffer, 0, bufferSize);                if (count == -1) {                    break;                }                os.write(buffer, 0, count);            }        } catch (IOException e) {            throw e;        }    }}

整个帮助类:

public class ZipDownLoadHelper{    private static final int BUFFER_SIZE = 1024;    private static final int DOWN_BEGIN = 0;    private static final int DOWN_UPDATA = 1;    private static final int DOWN_FINISH = 2;    private static final int DOWN_ERROR = 3;    private static final int UNPACK_BEGIN = 4;    private static final int UNPACK_END = 5;    private static final int UNPACK_ERROR = 6;    private Context mContext;    private Thread mDownLoadThread;    private OnZipDownLoadAndUnpackListener mOnZipDownLoadAndUnpackListener;    private Handler handler = new Handler()    {        public void handleMessage(Message msg)        {            if (!Thread.currentThread().isInterrupted())            {                switch (msg.what)                {                    case DOWN_BEGIN :                        if (mOnZipDownLoadAndUnpackListener != null)                        {                            mOnZipDownLoadAndUnpackListener.onDownLoadStart();                        }                        break;                    case DOWN_UPDATA :                        int factor = msg.arg1;                        if (mOnZipDownLoadAndUnpackListener != null)                        {                            mOnZipDownLoadAndUnpackListener                                    .onDownLoading(factor);                        }                        break;                    case DOWN_FINISH :                        if (mOnZipDownLoadAndUnpackListener != null)                        {                            mOnZipDownLoadAndUnpackListener.onDownLoadFinish();                        }                        break;                    case DOWN_ERROR :                        if (mOnZipDownLoadAndUnpackListener != null)                        {                            mOnZipDownLoadAndUnpackListener.onDownLoadError();                        }                        break;                    case UNPACK_BEGIN :                        if (mOnZipDownLoadAndUnpackListener != null)                        {                            mOnZipDownLoadAndUnpackListener.onZipUnpackStart();                        }                        break;                    case UNPACK_END :                        if (mOnZipDownLoadAndUnpackListener != null)                        {                            mOnZipDownLoadAndUnpackListener.onZipUnpackFinish();                        }                        break;                    case UNPACK_ERROR:                        break;                    default :                        break;                }            }        };    };    public ZipDownLoadHelper(Context context)    {        this.mContext = context;    }    /**     * 开启线程     *      * @param url     */    public void startDownLoadAndZip(final String url)    {        mDownLoadThread = new Thread()        {            @Override            public void run()            {                sendMessage(DOWN_BEGIN, 0);                // Temp folder for holding asset during download                File zipDir = ExternalStorage.getSDCacheDir(mContext, "tmp");                // File path to store .zip file before unzipping                File zipFile = new File(zipDir.getPath() + "/temp.zip");                // Folder to hold unzipped output                File outputDir = ExternalStorage.getSDCacheDir(mContext,                        "wms");                try                {                    download(url, zipFile, zipDir);                    unzipFile(zipFile, outputDir);                } finally                {                    zipFile.delete();                }            }        };        mDownLoadThread.start();    }    @SuppressWarnings("deprecation")    public void destroyThread()    {        mDownLoadThread.stop();    }    /**     * 下载文件     *      * @param down_url     * @param output     * @param tmpDir     */    private void download(String down_url, File output, File tmpDir)    {        InputStream inputStream = null;        OutputStream outputStream = null;        File tmp = null;        int down_step = 1;// 提示step        int totalSize = 0;        int downloadCount = 0;// 已经下载好的大小        int updateCount = 0;// 已经上传的文件大小        try        {            tmp = File.createTempFile("download", ".tmp", tmpDir);            URL url = new URL(down_url);            HttpURLConnection httpURLConnection = (HttpURLConnection) url                    .openConnection();            httpURLConnection.setConnectTimeout(30 * 1000);            httpURLConnection.setReadTimeout(30 * 1000);            // 获取下载文件的size            totalSize = httpURLConnection.getContentLength();            inputStream = new URL(down_url).openStream();            outputStream = new BufferedOutputStream(new FileOutputStream(tmp));            byte[] buffer = new byte[BUFFER_SIZE];            int readsize = 0;            while ((readsize = inputStream.read(buffer)) != -1)            {                outputStream.write(buffer, 0, readsize);                downloadCount += readsize;// 时时获取下载到的大小                // 每次增长1%                if (updateCount == 0                        || (downloadCount * 100 / totalSize - down_step) >= updateCount)                {                    updateCount += down_step;                    sendMessage(DOWN_UPDATA, updateCount);                }            }            if (httpURLConnection != null)            {                httpURLConnection.disconnect();            }            tmp.renameTo(output);            tmp = null;        } catch (IOException e)        {            sendMessage(DOWN_ERROR, 0);            throw new RuntimeException(e);        } finally        {            try            {                if (tmp != null)                {                    tmp.delete();                    tmp = null;                }                if (inputStream != null)                {                    inputStream.close();                    inputStream = null;                }                if (outputStream != null)                {                    outputStream.close();                    outputStream = null;                }            } catch (Exception e2)            {                sendMessage(DOWN_ERROR, 0);            }            sendMessage(DOWN_FINISH, 0);        }    }    private void sendMessage(int flag, int factor)    {        Message msg = new Message();        switch (flag)        {            case DOWN_BEGIN :// 开始            case DOWN_FINISH :// 完成            case DOWN_ERROR :// 失败            case UNPACK_BEGIN :            case UNPACK_END :            case UNPACK_ERROR:                break;            case DOWN_UPDATA :// 更新进度条                msg.arg1 = factor;                break;            default :                break;        }        msg.what = flag;        handler.sendMessage(msg);    }    /**     * 解压文件     *      * @param zipFile     * @param destination     */    private void unzipFile(File zipFile, File destination)    {        sendMessage(UNPACK_BEGIN, 0);        ZipUnPack decomp = new ZipUnPack(zipFile.getPath(),                destination.getPath() + File.separator);        Boolean isOk = decomp.unzip();        if(!isOk)        {            sendMessage(UNPACK_ERROR, 0);        }        else        {            sendMessage(UNPACK_END, 0);        }    }    /**     * 绑定监听     *      * @param listener     */    public void setOnZipDownLoadAndUnpackListener(            OnZipDownLoadAndUnpackListener listener)    {        this.mOnZipDownLoadAndUnpackListener = listener;    }    public interface OnZipDownLoadAndUnpackListener    {        /**         * 下载开始         */        public void onDownLoadStart();        /**         * 下载更新         *          * @param factor         */        public void onDownLoading(int factor);        /**         * 下载失败         */        public void onDownLoadError();        /**         * 下载完成         */        public void onDownLoadFinish();        /**         * 解压开始         */        public void onZipUnpackStart();        /**         * 解压失败         */        public void onZipUnpackError();        /**         * 解压完成         */        public void onZipUnpackFinish();    }}

没有认真地检查,可能有bug,使用的伙伴请自己debug下,并通知我一下,谢谢

1 0