Android实现文件解压带进度条功能
时间:2022-07-28
本文章向大家介绍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实现文件解压带进度条功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 关于leetcode第56题合并重复区间的解析
- java-覆盖equals和hashcode方法
- java-单链表反转解法及分析
- JAVA-判断两个单链表是否相交并求交点
- 删除排序数组中重复元素的方法
- zookeeper-3.4.10伪集群模式搭建及简单操作
- 04 Confluent_Kafka权威指南 第四章: kafka消费者:从kafka读取数据
- JAVA中的单例模式分析(doublecheck和枚举实现)
- 有关JAVA自动装箱-拆箱的分析
- 10 Confluent_Kafka权威指南 第十章:监控kafka
- 解决elasticsearch“Too many open files in system”问题
- elk基于jolokia监控springboot应用jvm方案
- elasticsearch集群更换节点操作
- 对storm1.2.3并行度的理解
- RabbitMQ集群搭建过程