Android实现文件解压带进度条功能
作者:紫色飞鱼儿 发布时间:2023-02-26 19:01:05
标签:android,文件解压,进度条
解压的工具类
package com.example.videodemo.zip;
public class ZipProgressUtil {
/***
* 解压通用方法
*
* @param zipFileString
* 文件路径
* @param outPathString
* 解压路径
* @param listener
* 加压监听
*/
public static void UnZipFile(final String zipFileString, final String outPathString, final ZipListener listener) {
Thread zipThread = new UnZipMainThread(zipFileString, outPathString, listener);
zipThread.start();
}
public interface ZipListener {
/** 开始解压 */
void zipStart();
/** 解压成功 */
void zipSuccess();
/** 解压进度 */
void zipProgress(int progress);
/** 解压失败 */
void zipFail();
}
}
解压线程
package com.example.videodemo.zip;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import com.example.videodemo.zip.ZipProgressUtil.ZipListener;
public class UnZipMainThread extends Thread {
String zipFileString;
String outPathString;
ZipListener listener;
public UnZipMainThread(String zipFileString, String outPathString, ZipListener listener) {
this.zipFileString = zipFileString;
this.outPathString = outPathString;
this.listener = listener;
}
@Override
public void run() {
super.run();
try {
listener.zipStart();
long sumLength = 0;
// 获取解压之后文件的大小,用来计算解压的进度
long ziplength = getZipTrueSize(zipFileString);
System.out.println("====文件的大小==" + ziplength);
FileInputStream inputStream = new FileInputStream(zipFileString);
ZipInputStream inZip = new ZipInputStream(inputStream);
ZipEntry zipEntry;
String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
szName = szName.substring(0, szName.length() - 1);
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
File file = new File(outPathString + File.separator + szName);
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
while ((len = inZip.read(buffer)) != -1) {
sumLength += len;
int progress = (int) ((sumLength * 100) / ziplength);
updateProgress(progress, listener);
out.write(buffer, 0, len);
out.flush();
}
out.close();
}
}
listener.zipSuccess();
inZip.close();
} catch (Exception e) {
listener.zipFail();
}
}
int lastProgress = 0;
private void updateProgress(int progress, ZipListener listener2) {
/** 因为会频繁的刷新,这里我只是进度>1%的时候才去显示 */
if (progress > lastProgress) {
lastProgress = progress;
listener2.zipProgress(progress);
}
}
/**
* 获取压缩包解压后的内存大小
*
* @param filePath
* 文件路径
* @return 返回内存long类型的值
*/
public long getZipTrueSize(String filePath) {
long size = 0;
ZipFile f;
try {
f = new ZipFile(filePath);
Enumeration<? extends ZipEntry> en = f.entries();
while (en.hasMoreElements()) {
size += en.nextElement().getSize();
}
} catch (IOException e) {
e.printStackTrace();
}
return size;
}
}
界面调用方法.我使用的是静态的方法,方便,可以改成非静态的.看个人需求,//注意了,因为解压是放在线程中执行的,所以界面刷新的话,需要使用handler来刷新界面调用还是比较方便的
注意 :调用的方法传入的路径:
1:是压缩文件的全路径 /storage/reeman/1234.zip
2:解压文件的路径(非全路径) /storage/reeman/zip
package com.example.videodemo;
import com.example.videodemo.zip.ZipProgressUtil;
import com.example.videodemo.zip.ZipProgressUtil.ZipListener;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
private ProgressBar progressBar1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);
ZipProgressUtil.UnZipFile("解压文件的路径", "解压之后的路径", new ZipListener() {
public void zipSuccess() {
}
public void zipStart() {
}
public void zipProgress(int progress) {
}
public void zipFail() {
}
});
}
}
总结
以上所述是小编给大家介绍的Android实现文件解压带进度条功能网站的支持!
来源:http://blog.csdn.net/juhua2012/article/details/76964718


猜你喜欢
- 前言OpenCVSharp是OpenCV的.NET wrapper,是一名日本工程师开发的,项目地址为:https://github.com
- 解决My eclipse 工程发布时端口占用问题如果运行后如图的错,需要进行如下操作来解决:a:打开cmd,输入netstat -ano 找
- 在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(
- AnyChat(全名叫Anychat SDK),也叫音视频互动开发平台;是一套跨平台的即时通讯解决方案,基于先进的H.264视频编码标准、A
- 在以往的 Tomcat 项目中,一直习惯用 Ant 打包,使用 build.xml 配置,通过 ant -buildfile 的方式在机器上
- •android-support-v4.jar,这是谷歌官方给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Andro
- 1. 栈1.1 概念栈:是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。特点:栈中的数据元素遵循先进后出的原则,但要注意进的
- 本文实例讲述了Java排序算法总结之希尔排序。分享给大家供大家参考。具体分析如下:前言:希尔排序(Shell Sort)是插入排序的一种。是
- 背景2021年第一天早上,客户突然投诉说系统的一个功能出了问题,紧急排查后发现后端系统确实出了bug,原因为前端传输的JSON报文,后端反序
- 通过AIDL接口在进程间传递数据,记录在开发中遇到的一写问题AIDL支持数据类型如下:1. Java 的原生类型2. String 和Cha
- 从主线程发送消息到子线程(准确地说应该是非UI线程)package com.zhuozhuo;import android.app.Acti
- 一、DES加密和解密package com.itjh.javaUtil;import java.io.UnsupportedEncoding
- 泛型中占位符T和?有什么区别?这是一个好问题,有的人可能弄不清楚,所以我们这里简单的演示一下,相信大家一定能弄清楚的!先上两段代码:publ
- 一、Fork/Join框架的理解ForkJoinTask类属于java.util.concurrent 包下;ForkJoinTask类下有
- 本文实例为大家分享了Android实现无预览拍照功能的具体代码,供大家参考,具体内容如下实现思路:把预览的SurfaceView的宽高设置为
- 本文实例为大家分享了java实现饮料自助售货机的具体代码,供大家参考,具体内容如下①用户类import java.util.Scanner;
- 对于简单的场景来讲,在MEF中导入依赖模块非常简单,只要用ImportAttribute标记依赖的成员,MEF模块会自动找到并创建该模块。但
- 本文实例为大家分享了Android下拉展示条目的具体代码,供大家参考,具体内容如下布局文件<?xml version="1.
- 在 C# WPF开发中颜色对话框控件(ColorDialog)用于对界面中的背景、文字…(拥有颜色属性的所有控件)设置
- 在使用SpringSecurity中,大伙都知道默认的登录数据是通过key/value的形式来传递的,默认情况下不支持JSON格式的登录数据