Android zip文件下载和解压实例

 更新时间:2014年01月03日 16:25:21   作者:  
这篇文章主要介绍了Android zip文件下载和解压实例,有需要的朋友可以参考一下

下载:
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<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);
  }

 }
}

解压:
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<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);
  }

 }
}

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

}

相关文章

  • 利用kotlin实现一个饼图实例代码

    利用kotlin实现一个饼图实例代码

    饼状图是以不同颜色的圆的切片表示的值。下面这篇文章主要给大家介绍了关于利用kotlin实现一个饼图的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-12-12
  • Kotlin中?和!!的区别详细对比

    Kotlin中?和!!的区别详细对比

    这篇文章主要给大家介绍了关于Kotlin中?和!!区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Android AlertDialog的几种用法详解

    Android AlertDialog的几种用法详解

    这篇文章主要介绍了Android AlertDialog的几种用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • android 传感器(OnSensorChanged)使用介绍

    android 传感器(OnSensorChanged)使用介绍

    当传感器的值发生变化时,例如磁阻传感器方向改变时会调用OnSensorChanged(). 当传感器的精度发生变化时会调用OnAccuracyChanged()方法
    2014-11-11
  • Android仿微信图片选择器ImageSelector使用详解

    Android仿微信图片选择器ImageSelector使用详解

    这篇文章主要为大家详细介绍了Android仿微信图片选择器ImageSelector的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android根据不同身份配置APP对应的不同模块方法

    Android根据不同身份配置APP对应的不同模块方法

    今天小编就为大家分享一篇Android根据不同身份配置APP对应的不同模块方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android开发解决popupWindow重叠报错问题

    Android开发解决popupWindow重叠报错问题

    今天小编就为大家分享一篇关于Android开发解决popupWindow重叠报错问题的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Kotlin中常见的符号详解

    Kotlin中常见的符号详解

    这篇文章主要介绍了Kotlin中常见的符号详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android 6.0调用相机图册崩溃的完美解决方案

    Android 6.0调用相机图册崩溃的完美解决方案

    这篇文章主要介绍了Android 6.0调用相机图册崩溃的完美解决方案,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Android中使用AsyncTask实现文件下载以及进度更新提示

    Android中使用AsyncTask实现文件下载以及进度更新提示

    AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单,本篇文章主要介绍了Android中使用AsyncTask实现文件下载以及进度更新提示,有兴趣的可以了解一下。
    2016-12-12

最新评论