解压的工具类
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,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实现文件解压带进度条功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
总结以上是内存溢出为你收集整理的Android实现文件解压带进度条功能全部内容,希望文章能够帮你解决Android实现文件解压带进度条功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)