全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android实现下载zip压缩文件并解压的方法(附源码)

前言

其实在网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,所以这篇文章在此记录一下下载zip文件并直接解压的方法,直接上代码,文末有源码下载。

下载:

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnCancelListener; 
import android.os.AsyncTask; 
import android.util.Log; 
 
public class DownLoaderTask extends AsyncTask<Void, Integer, Long> { 
 private final String TAG = "DownLoaderTask"; 
 private URL mUrl; 
 private File mFile; 
 private ProgressDialog mDialog; 
 private int mProgress = 0; 
 private ProgressReportingOutputStream mOutputStream; 
 private Context mContext; 
 public DownLoaderTask(String url,String out,Context context){ 
  super(); 
  if(context!=null){ 
   mDialog = new ProgressDialog(context); 
   mContext = context; 
  } 
  else{ 
   mDialog = null; 
  } 
   
  try { 
   mUrl = new URL(url); 
   String fileName = new File(mUrl.getFile()).getName(); 
   mFile = new File(out, fileName); 
   Log.d(TAG, "out="+out+", name="+fileName+",mUrl.getFile()="+mUrl.getFile()); 
  } catch (MalformedURLException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
   
 } 
  
 @Override 
 protected void onPreExecute() { 
  // TODO Auto-generated method stub 
  //super.onPreExecute(); 
  if(mDialog!=null){ 
   mDialog.setTitle("Downloading..."); 
   mDialog.setMessage(mFile.getName()); 
   mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
   mDialog.setOnCancelListener(new OnCancelListener() { 
     
    @Override 
    public void onCancel(DialogInterface dialog) { 
     // TODO Auto-generated method stub 
     cancel(true); 
    } 
   }); 
   mDialog.show(); 
  } 
 } 
 
 @Override 
 protected Long doInBackground(Void... params) { 
  // TODO Auto-generated method stub 
  return download(); 
 } 
 
 @Override 
 protected void onProgressUpdate(Integer... values) { 
  // TODO Auto-generated method stub 
  //super.onProgressUpdate(values); 
  if(mDialog==null) 
   return; 
  if(values.length>1){ 
   int contentLength = values[1]; 
   if(contentLength==-1){ 
    mDialog.setIndeterminate(true); 
   } 
   else{ 
    mDialog.setMax(contentLength); 
   } 
  } 
  else{ 
   mDialog.setProgress(values[0].intValue()); 
  } 
 } 
 
 @Override 
 protected void onPostExecute(Long result) { 
  // TODO Auto-generated method stub 
  //super.onPostExecute(result); 
  if(mDialog!=null&&mDialog.isShowing()){ 
   mDialog.dismiss(); 
  } 
  if(isCancelled()) 
   return; 
  ((MainActivity)mContext).showUnzipDialog(); 
 } 
 
 private long download(){ 
  URLConnection connection = null; 
  int bytesCopied = 0; 
  try { 
   connection = mUrl.openConnection(); 
   int length = connection.getContentLength(); 
   if(mFile.exists()&&length == mFile.length()){ 
    Log.d(TAG, "file "+mFile.getName()+" already exits!!"); 
    return 0l; 
   } 
   mOutputStream = new ProgressReportingOutputStream(mFile); 
   publishProgress(0,length); 
   bytesCopied =copy(connection.getInputStream(),mOutputStream); 
   if(bytesCopied!=length&&length!=-1){ 
    Log.e(TAG, "Download incomplete bytesCopied="+bytesCopied+", length"+length); 
   } 
   mOutputStream.close(); 
  } catch (IOException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
  return bytesCopied; 
 } 
 private int copy(InputStream input, OutputStream output){ 
  byte[] buffer = new byte[1024*8]; 
  BufferedInputStream in = new BufferedInputStream(input, 1024*8); 
  BufferedOutputStream out = new BufferedOutputStream(output, 1024*8); 
  int count =0,n=0; 
  try { 
   while((n=in.read(buffer, 0, 1024*8))!=-1){ 
    out.write(buffer, 0, n); 
    count+=n; 
   } 
   out.flush(); 
  } catch (IOException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  }finally{ 
   try { 
    out.close(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
   try { 
    in.close(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
  } 
  return count; 
 } 
 private final class ProgressReportingOutputStream extends FileOutputStream{ 
 
  public ProgressReportingOutputStream(File file) 
    throws FileNotFoundException { 
   super(file); 
   // TODO Auto-generated constructor stub 
  } 
 
  @Override 
  public void write(byte[] buffer, int byteOffset, int byteCount) 
    throws IOException { 
   // TODO Auto-generated method stub 
   super.write(buffer, byteOffset, byteCount); 
   mProgress += byteCount; 
   publishProgress(mProgress); 
  } 
   
 } 
} 

解压:

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Enumeration; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipException; 
import java.util.zip.ZipFile; 
 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnCancelListener; 
import android.os.AsyncTask; 
import android.util.Log; 
 
public class ZipExtractorTask extends AsyncTask<Void, Integer, Long> { 
 private final String TAG = "ZipExtractorTask"; 
 private final File mInput; 
 private final File mOutput; 
 private final ProgressDialog mDialog; 
 private int mProgress = 0; 
 private final Context mContext; 
 private boolean mReplaceAll; 
 public ZipExtractorTask(String in, String out, Context context, boolean replaceAll){ 
  super(); 
  mInput = new File(in); 
  mOutput = new File(out); 
  if(!mOutput.exists()){ 
   if(!mOutput.mkdirs()){ 
    Log.e(TAG, "Failed to make directories:"+mOutput.getAbsolutePath()); 
   } 
  } 
  if(context!=null){ 
   mDialog = new ProgressDialog(context); 
  } 
  else{ 
   mDialog = null; 
  } 
  mContext = context; 
  mReplaceAll = replaceAll; 
 } 
 @Override 
 protected Long doInBackground(Void... params) { 
  // TODO Auto-generated method stub 
  return unzip(); 
 } 
  
 @Override 
 protected void onPostExecute(Long result) { 
  // TODO Auto-generated method stub 
  //super.onPostExecute(result); 
  if(mDialog!=null&&mDialog.isShowing()){ 
   mDialog.dismiss(); 
  } 
  if(isCancelled()) 
   return; 
 } 
 @Override 
 protected void onPreExecute() { 
  // TODO Auto-generated method stub 
  //super.onPreExecute(); 
  if(mDialog!=null){ 
   mDialog.setTitle("Extracting"); 
   mDialog.setMessage(mInput.getName()); 
   mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
   mDialog.setOnCancelListener(new OnCancelListener() { 
     
    @Override 
    public void onCancel(DialogInterface dialog) { 
     // TODO Auto-generated method stub 
     cancel(true); 
    } 
   }); 
   mDialog.show(); 
  } 
 } 
 @Override 
 protected void onProgressUpdate(Integer... values) { 
  // TODO Auto-generated method stub 
  //super.onProgressUpdate(values); 
  if(mDialog==null) 
   return; 
  if(values.length>1){ 
   int max=values[1]; 
   mDialog.setMax(max); 
  } 
  else 
   mDialog.setProgress(values[0].intValue()); 
 } 
 private long unzip(){ 
  long extractedSize = 0L; 
  Enumeration<ZipEntry> entries; 
  ZipFile zip = null; 
  try { 
   zip = new ZipFile(mInput); 
   long uncompressedSize = getOriginalSize(zip); 
   publishProgress(0, (int) uncompressedSize); 
    
   entries = (Enumeration<ZipEntry>) zip.entries(); 
   while(entries.hasMoreElements()){ 
    ZipEntry entry = entries.nextElement(); 
    if(entry.isDirectory()){ 
     continue; 
    } 
    File destination = new File(mOutput, entry.getName()); 
    if(!destination.getParentFile().exists()){ 
     Log.e(TAG, "make="+destination.getParentFile().getAbsolutePath()); 
     destination.getParentFile().mkdirs(); 
    } 
    if(destination.exists()&&mContext!=null&&!mReplaceAll){ 
      
    } 
    ProgressReportingOutputStream outStream = new ProgressReportingOutputStream(destination); 
    extractedSize+=copy(zip.getInputStream(entry),outStream); 
    outStream.close(); 
   } 
  } catch (ZipException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } catch (IOException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  }finally{ 
   try { 
    zip.close(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
  } 
 
  return extractedSize; 
 } 
 
 private long getOriginalSize(ZipFile file){ 
  Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) file.entries(); 
  long originalSize = 0l; 
  while(entries.hasMoreElements()){ 
   ZipEntry entry = entries.nextElement(); 
   if(entry.getSize()>=0){ 
    originalSize+=entry.getSize(); 
   } 
  } 
  return originalSize; 
 } 
  
 private int copy(InputStream input, OutputStream output){ 
  byte[] buffer = new byte[1024*8]; 
  BufferedInputStream in = new BufferedInputStream(input, 1024*8); 
  BufferedOutputStream out = new BufferedOutputStream(output, 1024*8); 
  int count =0,n=0; 
  try { 
   while((n=in.read(buffer, 0, 1024*8))!=-1){ 
    out.write(buffer, 0, n); 
    count+=n; 
   } 
   out.flush(); 
  } catch (IOException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  }finally{ 
   try { 
    out.close(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
   try { 
    in.close(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
  } 
  return count; 
 } 
  
 private final class ProgressReportingOutputStream extends FileOutputStream{ 
 
  public ProgressReportingOutputStream(File file) 
    throws FileNotFoundException { 
   super(file); 
   // TODO Auto-generated constructor stub 
  } 
 
  @Override 
  public void write(byte[] buffer, int byteOffset, int byteCount) 
    throws IOException { 
   // TODO Auto-generated method stub 
   super.write(buffer, byteOffset, byteCount); 
   mProgress += byteCount; 
   publishProgress(mProgress); 
  } 
   
 } 
} 

权限:

<uses-permission android:name="android.permission.INTERNET" /> 
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
 <!-- 创建和删除文件 --> 
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
 <!-- 写文件 --> 
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
 <uses-permission android:name="android.permission.VIBRATE" /> 
 <uses-permission android:name="android.permission.READ_APN_SETTINGS" /> 
 <uses-permission android:name="android.permission.RESTART_PACKAGES"/> 
 
 <!-- 统计 --> 
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
 <uses-permission android:name="android.permission.READ_LOGS" /> 
 <uses-permission android:name="android.permission.WAKE_LOCK" /> 
 <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> 

源码下载:点击这里

总结

以上就是这篇文章的全部内容了,希望这篇文章对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对能带来一定的帮助。


# android  # 解压缩zip  # java  # 解压缩zip文件  # 文件解压缩  # Android中文件的压缩和解压缩实例代码  # Android如何实现压缩和解压缩文件  # Android编程实现将压缩数据库文件拷贝到安装目录的方法  # Android实现zip文件压缩及解压缩的方法  # android打开rar压缩文件  # Android实现文件或文件夹压缩成.zip格式压缩包  # 这篇文章  # 源码下载  # 在此  # 有很多  # 不多  # 点击这里  # 谢谢大家  # 在网上  # 有疑问  # fileName  # getFile  # context  # super  # null  # generated  # Auto  # TODO  # getName  # catch  # url 


相关文章: 如何在Golang中引入测试模块_Golang测试包导入与使用实践  个人网站制作流程图片大全,个人网站如何注销?  jQuery 常见小例汇总  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  常州自助建站工具推荐:低成本搭建与模板选择技巧  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  网站制作需要会哪些技术,建立一个网站要花费多少?  C#如何在一个XML文件中查找并替换文本内容  婚礼视频制作网站,学习*后期制作的网站有哪些?  怎么将XML数据可视化 D3.js加载XML  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  网站制作壁纸教程视频,电脑壁纸网站?  宝塔面板如何快速创建新站点?  建站之星伪静态规则如何设置?  如何在七牛云存储上搭建网站并设置自定义域名?  如何通过智能用户系统一键生成高效建站方案?  油猴 教程,油猴搜脚本为什么会网页无法显示?  香港服务器部署网站为何提示未备案?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  建站为何优先选择香港服务器?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何选择最佳自助建站系统?快速指南解析优劣  如何在香港免费服务器上快速搭建网站?  如何在腾讯云服务器快速搭建个人网站?  高端建站三要素:定制模板、企业官网与响应式设计优化  广东专业制作网站有哪些,广东省能源集团有限公司官网?  如何自定义建站之星模板颜色并下载新样式?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  网站app免费制作软件,能免费看各大网站视频的手机app?  常州企业网站制作公司,全国继续教育网怎么登录?  模具网站制作流程,如何找模具客户?  如何挑选高效建站主机与优质域名?  潮流网站制作头像软件下载,适合母子的网名有哪些?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  建站主机选购指南:核心配置优化与品牌推荐方案  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何快速搭建虚拟主机网站?新手必看指南  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  大同网页,大同瑞慈医院官网?  如何彻底删除建站之星生成的Banner?  如何挑选最适合建站的高性能VPS主机?  网站制作的步骤包括,正确网址格式怎么写?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何在阿里云虚拟主机上快速搭建个人网站?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  建站ABC备案流程中有哪些关键注意事项?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  网页设计网站制作软件,microsoft office哪个可以创建网页? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。