安卓文件解压带进度条(非zip4j框架)

来源:互联网 发布:p字体的软件 编辑:程序博客网 时间:2024/06/06 01:44

前段时间碰到一个项目,涉及到文件解压功能,当时用的是__Zip4j解压框架,由于当时解压出现了一些无法解决的异常,最后还是放弃用框架,自己写了一个解压的方法

zip4j 的优点在于他可以计算解压的进度,网上很多博客都没有提供此方法,用起来很不爽,也不知道解压多少了


这里不提供源码下载了,就这三个类,如有疑问请留言.


解压的工具类

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;}@Overridepublic 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来刷新界面

调用还是比较方便的


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;@Overrideprotected 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() {}});}}


0 0
原创粉丝点击