Zip文件是我们经常用到压缩文件格式,android中在进行网络请求大批量数据时,通常会采用传递zip文件,这样做即可以减少网络流量的消耗,加快请求的响应速度,又可以减少对存储空间的要求,所以当我们将zip文件读取回来的时候,如何解压就是一个要解决的问题,虽然java本身提供了zip相关的API,但不是很强大,所以我们采用apache开源组织的zip4j,通过这个jar包可以十分轻松的解压zip文件.

回到项目中去,项目中有个需求是从服务器请求杂志,请求回来后给读者展示,但是由于公司自己做的电子杂志太大,最少也得20M,这是一个十分庞大的数据,所以与服务器商定采用zip来传输,可以降低文件的大小,减少服务器的压力.我当时的处理过程:

1.使用HttpURLConnection与服务器取得连接,得到输入流inputstream.

2.利用java zip流,将 inputstream转化为zip流.

3.记录每次传输的位置,保存于临时文件中.(用于断点续传,由于数据量大,所以要做断点续传,以后详解)

4.循环读取流完毕后生成一个zip文件,将zip文件解压并实时将解压进度显示.

通过以上四步就完成了从服务器读取zip包,并将zip包解压给用户展示,本文主要总结最后一步:

通过阅读zip4j官网demo,可以得知,这个jar包本身是支持对解压进度的读取这一功能的.下面是我自己写的一个demo,可以实时的将解压进度发送出来,在界面上进行更新.

先看一下demo的解压进度效果图,比较简单,有了数据后,效果想做的多复杂都可以,例如可以根据进度去绘制一个进度条等.

这是某一时刻的截图.

代码:package util;

import java.io.File;

import net.lingala.zip4j.core.ZipFile;

import net.lingala.zip4j.exception.ZipException;

import net.lingala.zip4j.progress.ProgressMonitor;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

/**

* @author rzq

* @function 封装一个解压工具类,以后如果需要压缩相关的方法,都放到此类中

*/

public class ZipUtil

{

private static final String password = "test123";

public static void unZipFileWithProgress(final File zipFile, final String filePath, final Handler handler,

final boolean isDeleteZip) throws ZipException

{

ZipFile zFile = new ZipFile(zipFile);

zFile.setFileNameCharset("GBK");

if (!zFile.isValidZipFile())

{ //

throw new ZipException("exception!");

}

File destDir = new File(filePath); // ????¼

if (destDir.isDirectory() && !destDir.exists())

{

destDir.mkdir();

}

if (zFile.isEncrypted())

{

zFile.setPassword(password); // 设置解压密码

}

final ProgressMonitor progressMonitor = zFile.getProgressMonitor();

Thread thread = new Thread(new Runnable()

{

@Override

public void run()

{

Bundle bundle = null;

Message msg = null;

try

{

int precentDone = 0;

if (handler == null)

{

return;

}

handler.sendEmptyMessage(CompressStatus.START);

while (true)

{

// 每隔50ms,发送一个解压进度出去

Thread.sleep(50);

precentDone = progressMonitor.getPercentDone();

bundle = new Bundle();

bundle.putInt(CompressStatus.PERCENT, precentDone);

msg = new Message();

msg.what = CompressStatus.HANDLING;

msg.setData(bundle);

handler.sendMessage(msg); //通过 Handler将进度扔出去

if (precentDone >= 100)

{

break;

}

}

handler.sendEmptyMessage(CompressStatus.COMPLETED);

}

catch (InterruptedException e)

{

bundle = new Bundle();

bundle.putString(CompressStatus.ERROR_COM, e.getMessage());

msg = new Message();

msg.what = CompressStatus.ERROR;

msg.setData(bundle);

handler.sendMessage(msg);

e.printStackTrace();

}

finally

{

if (isDeleteZip)

{

zipFile.delete();//将原压缩文件删除

}

}

}

});

thread.start();

zFile.setRunInThread(true); //true 在子线程中进行解压 , false主线程中解压

zFile.extractAll(filePath); //将压缩文件解压到filePath中...

}

}

/**

* 封装不同的解压状态

*

**/

public class CompressStatus

{

public final static int START = 10000;

public final static int HANDLING = 10001;

public final static int COMPLETED = 10002;

public final static int ERROR = 10003;

public final static String PERCENT = "PERCENT";

public final static String ERROR_COM = "ERROR";

}

package com.example.zipprogress;

import java.io.File;

import net.lingala.zip4j.exception.ZipException;

import util.CompressStatus;

import util.ZipUtil;

import android.app.Activity;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.widget.TextView;

/**

* @author rzq

* @function 要更新的 UI

*/

public class MainActivity extends Activity {

TextView tv;

String zipFilePath;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tv = (TextView) findViewById(R.id.text_progress);

zipFilePath = Environment.getExternalStorageDirectory().toString()

+ "/Desktop.zip";

File zipFile = new File(zipFilePath);

try {

ZipUtil.unZipFileWithProgress(zipFile,

Environment.getExternalStorageDirectory() + "/myTest/",

handler, false);

} catch (ZipException e) {

e.printStackTrace();

}

}

private Handler handler = new Handler() {

public void handleMessage(Message msg) {

switch (msg.what) {

case CompressStatus.START:

tv.setText("start!");

break;

case CompressStatus.HANDLING:

Bundle b = msg.getData();

tv.setText(b.getInt(CompressStatus.PERCENT) + "%");

break;

case CompressStatus.COMPLETED:

tv.setText("end!");

break;

case CompressStatus.ERROR:

tv.setText("error");

break;

}

};

};

}

总结:  主要就是对API的掌握和通过Handler对消息的传递,由于zip4j的下载需要翻强,所以我将demo代码和zip4j包的源码和jar文件都上传,有需要的可以直接下载.

原文:http://blog.csdn.net/lcq5211314123/article/details/41682357

android zip解压进度_android zip4j之--解压zip文件并实时显示解压进度相关推荐

  1. 使用Http下载文件并实时显示进度 --转载

    转载​​​​​​ Qt中使用Http下载文件并实时显示进度 - 知乎 前几天写了一篇关于Http通讯进行GET.POST的操作,那么,今天的这篇文章也是基于Http通讯的,但是功能不同. 当前文章讲解 ...

  2. pythondifflib详解_用python标准库difflib比较两份文件的异同详解

    [需求背景] 有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_file,但是输出的结果读起来不是很友好.这时候使用python ...

  3. 编写Shell程序,通过编写完成compress1、decompress1函数,选择“压缩”或“解压”以及输入文件名,来自动完成文件的压缩、解压过程。

    创建一个文件,其中包括mycompress1.sh,mydecompress1.sh和mypro.sh文件.其中mypro.sh 写入的代码如下: #!/bin/bash while : doecho ...

  4. 解决办法:360压缩解压出现空白文件创建失败,但压缩包文件无损坏显示有十几个文件

    问题如下:压缩文件正常有8.5M,15个文件,但360压缩打开只有一个空文件. 解决办法:如果,压缩文件右键→打开方式→Windows资源管理器,就可以打开了.

  5. linux解压rar多层文件夹,linux rar 解压文件夹_rar文件夹

    原标题:linux rar 解压文件夹_rar文件夹 本经验主要针对linux中的解压缩进行讲解工具/原料linux电脑一台linux文件解压缩1目前 rar a jpg.rar *.jpg //ra ...

  6. 基于Jquery插件Uploadify实现实时显示进度条上传图片

    网址:http://www.jb51.net/article/83811.htm 这篇文章主要介绍了基于Jquery插件Uploadify实现实时显示进度条上传图片的相关资料,感兴趣的小伙伴们可以参考 ...

  7. 使用Uploadify实现上传图片生成缩略图例子,实时显示进度条

    不了解Uploadify的,先看看前一篇详细说明 http://www.cnblogs.com/XuebinDing/archive/2012/04/26/2470995.html Uploadify ...

  8. 阿里云视频上传视频获取进度条问题(使用session方案,获取进度一直为0的解决方案)补充:前后端分离项目中获取进度解决方案

    1.场景描述: 之前用阿里云上传视频,前端反应上传视频经常出现获取视频url失败问题.但是接口我测过很多遍都是没有问题的.后台这边提供了一个视频上传的接口返回一个videoId,还提供了一个根据vid ...

  9. Android——SRT字幕文件的下载、解压、转换、显示

    SRT字幕文件的下载.解压.显示 简介 下载 创建文件夹 文件下载 下载调用以及文件解析调用 解析 ZIP文件解析 外部引用 转换 转换SRT字幕文件 获取SRT文件list实体数据 显示 字幕显示 ...

最新文章

  1. Couchbase应用示例(初探)
  2. mysql视图子查询_mysql创建视图不能包涵子查询的解决办法。View's SELECT contains a subquery in the FROM clause...
  3. SAP Spartacus里的product carousel控件的实现cx-product-carousel
  4. 简单的选项卡功能实现
  5. 《JavaScript高级程序设计》红宝书第一遍阅读(了解概念)
  6. Android聊天机器人
  7. python 解除excel的密码_我帮公司财务写了个“群发工资条”的Python脚本!
  8. Python笔记4 实例之批量修改文件名
  9. 一种自动(半自动)学习的算法(验证码识别)
  10. shell 编写脚本批量ping ip
  11. 内部推荐岗位信息201508
  12. C++描述 LeetCode 480. 滑动窗口中位数
  13. correl函数相关系数大小意义_EXCEL中的相关系数能说明什么?
  14. 高中时代的黑历史产物
  15. Python爬虫之QQ空间登陆获取信息!
  16. 下载加速小妙招,我不允许你不知道
  17. 面向对象系列(三)-抽象类的特点
  18. 有趣的数学结论(未完待续)
  19. 微带线与带状线的区别
  20. supervisor+cesi多服务器进程集中管理

热门文章

  1. 微信小程序文本组件text使用详解-微信小程序系统学习攻略​
  2. 百度艾菲达成深度合作 引领AI营销新实践
  3. Tryhackme-Cryptography
  4. apigateway-kong(二)admin-api(结合实例)
  5. 4*4薄膜键盘的电路连接和驱动(树莓派)
  6. python六角星_python畫五角星和六角星程序
  7. 什么是Defensive Copy
  8. 《梦幻花》-东野圭吾
  9. mysql主要有哪三大数据类型_MySQL主要有哪些数据类型
  10. CentOS7安装桌面环境(腾讯云)