android zip解压进度_Android中实现下载和解压zip文件功能代码分享

本文提供了2段Android代码,实现了从Android客户端下载ZIP文件并且实现ZIP文件的解压功能,非常实用,有需要的Android开发者可以尝试一下。

下载:

DownLoaderTask.java

package com.johnny.testzipanddownload;

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 {

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);   }

} }

解压:

ZipExtractorTask .java

package com.johnny.testzipanddownload;

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 {

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 entries;   ZipFile zip = null;   try {    zip = new ZipFile(mInput);    long uncompressedSize = getOriginalSize(zip);    publishProgress(0, (int) uncompressedSize);

entries = (Enumeration) 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 entries = (Enumeration) 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);   }

} }

Main Activity

MainActivity.java

package com.johnny.testzipanddownload;

import android.os.Bundle;

import android.os.Environment;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.util.Log;

import android.view.Menu;

public class MainActivity extends Activity {

private final String TAG="MainActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.d(TAG, "Environment.getExternalStorageDirectory()="+Environment.getExternalStorageDirectory());

Log.d(TAG, "getCacheDir().getAbsolutePath()="+getCacheDir().getAbsolutePath());

showDownLoadDialog();   //doZipExtractorWork();   //doDownLoadWork();  }  @Override  public boolean onCreateOptionsMenu(Menu menu) {   // Inflate the menu; this adds items to the action bar if it is present.   getMenuInflater().inflate(R.menu.main, menu);   return true;  }

private void showDownLoadDialog(){   new AlertDialog.Builder(this).setTitle("确认")   .setMessage("是否下载?")   .setPositiveButton("是", new OnClickListener() {

@Override    public void onClick(DialogInterface dialog, int which) {     // TODO Auto-generated method stub     Log.d(TAG, "onClick 1 = "+which);     doDownLoadWork();    }   })   .setNegativeButton("否", new OnClickListener() {

@Override    public void onClick(DialogInterface dialog, int which) {     // TODO Auto-generated method stub     Log.d(TAG, "onClick 2 = "+which);    }   })   .show();  }

public void showUnzipDialog(){   new AlertDialog.Builder(this).setTitle("确认")   .setMessage("是否解压?")   .setPositiveButton("是", new OnClickListener() {

@Override    public void onClick(DialogInterface dialog, int which) {     // TODO Auto-generated method stub     Log.d(TAG, "onClick 1 = "+which);     doZipExtractorWork();    }   })   .setNegativeButton("否", new OnClickListener() {

@Override    public void onClick(DialogInterface dialog, int which) {     // TODO Auto-generated method stub     Log.d(TAG, "onClick 2 = "+which);    }   })   .show();  }

public void doZipExtractorWork(){   //ZipExtractorTask task = new ZipExtractorTask("/storage/usb3/system.zip", "/storage/emulated/legacy/", this, true);   ZipExtractorTask task = new ZipExtractorTask("/storage/emulated/legacy/testzip.zip", "/storage/emulated/legacy/", this, true);   task.execute();  }

private void doDownLoadWork(){   DownLoaderTask task = new DownLoaderTask("http://192.168.9.155/johnny/testzip.zip", "/storage/emulated/legacy/", this);   //DownLoaderTask task = new DownLoaderTask("http://192.168.9.155/johnny/test.h264", getCacheDir().getAbsolutePath()+"/", this);   task.execute();  } }

以上就是Android实现zip文件下载和解压功能,希望对你有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值