全网整合营销服务商

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

免费咨询热线: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 


相关文章: 深圳网站制作的公司有哪些,dido官方网站?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  c# 服务器GC和工作站GC的区别和设置  建站之星导航配置指南:自助建站与SEO优化全解析  建站之星代理平台如何选择最佳方案?  网站企业制作流程,用什么语言做企业网站比较好?  如何快速查询网站的真实建站时间?  建站三合一如何选?哪家性价比更高?  SQL查询语句优化的实用方法总结  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  建站之星如何保障用户数据免受黑客入侵?  如何在阿里云服务器自主搭建网站?  已有域名和空间,如何快速搭建网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  高防服务器租用如何选择配置与防御等级?  网站制作免费,什么网站能看正片电影?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  建站与域名管理如何高效结合?  C++中引用和指针有什么区别?(代码说明)  如何用y主机助手快速搭建网站?  怎么将XML数据可视化 D3.js加载XML  宿州网站制作公司兴策,安徽省低保查询网站?  C#怎么使用委托和事件 C# delegate与event编程方法  建站之星Pro快速搭建教程:模板选择与功能配置指南  魔毅自助建站系统:模板定制与SEO优化一键生成指南  宝塔建站助手安装配置与建站模板使用全流程解析  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  济南专业网站制作公司,济南信息工程学校怎么样?  建设网站制作价格,怎样建立自己的公司网站?  如何挑选高效建站主机与优质域名?  开心动漫网站制作软件下载,十分开心动画为何停播?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  北京制作网站的公司,北京铁路集团官方网站?  建站之星云端配置指南:模板选择与SEO优化一键生成  如何通过PHP快速构建高效问答网站功能?  北京企业网站设计制作公司,北京铁路集团官方网站?  定制建站流程步骤详解:一站式方案设计与开发指南  用v-html解决Vue.js渲染中html标签不被解析的问题  深圳网站制作案例,网页的相关名词有哪些?  建站主机解析:虚拟主机配置与服务器选择指南    免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何快速生成ASP一键建站模板并优化安全性?  广州美橙建站如何快速搭建多端合一网站?  如何在Golang中使用replace替换模块_指定本地或远程路径  如何在建站之星绑定自定义域名?  如何通过VPS搭建网站快速盈利?  如何通过建站之星自助学习解决操作问题?  如何在景安云服务器上绑定域名并配置虚拟主机? 

您的项目需求

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