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压缩文件并解压的方法(附源码)

相关文章:

你感兴趣的文章:

标签云: