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开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对能带来一定的帮助。