前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android实现文件解压带进度条功能

Android实现文件解压带进度条功能

作者头像
砸漏
发布2020-10-22 11:18:58
9560
发布2020-10-22 11:18:58
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

解压的工具类

代码语言:javascript
复制
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(); 
  } 
} 

解压线程

代码语言:javascript
复制
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

代码语言:javascript
复制
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网站的支持!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档