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

}

(0)

相关推荐

  • Android使用缓存机制实现文件下载及异步请求图片加三级缓存

    首先给大家介绍Android使用缓存机制实现文件下载 在下载文件或者在线浏览文件时,或者为了保证文件下载的正确性,需要使用缓存机制,常使用SoftReference来实现. SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收.也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用.另外

  • Android文件下载进度条的实现代码

    main.xml: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_paren

  • Android实现文件下载进度显示功能

    和大家一起分享一下学习经验,如何实现Android文件下载进度显示功能,希望对广大初学者有帮助. 先上效果图: 上方的蓝色进度条,会根据文件下载量的百分比进行加载,中部的文本控件用来现在文件下载的百分比,最下方的ImageView用来展示下载好的文件,项目的目的就是动态向用户展示文件的下载量. 下面看代码实现:首先是布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm

  • Android 中HttpURLConnection与HttpClient使用的简单实例

    1:HttpHelper.java 复制代码 代码如下: public class HttpHelper {    //1:标准的Java接口    public static String getStringFromNet1(String param){        String result="";        try{            URL url=new URL(param);            HttpURLConnection conn=(HttpURLCo

  • Android基于HttpUrlConnection类的文件下载实例代码

    废话不多说了,直接给大家贴代码了,具体代码如所示: /** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param path */ private void httpDown(final String path) { new Thread() { @Override public void run() { URL url; HttpURLConnection connectio

  • Android中HttpURLConnection与HttpClient的使用与封装

    1.写在前面 大部分andriod应用需要与服务器进行数据交互,HTTP.FTP.SMTP或者是直接基于SOCKET编程都可以进行数据交互,但是HTTP必然是使用最广泛的协议.     本文并不针对HTTP协议的具体内容,仅探讨android开发中使用HTTP协议访问网络的两种方式--HttpURLConnection和HttpClient     因为需要访问网络,需在AndroidManifest.xml中添加如下权限 <uses-permission android:name="an

  • Android程序开发通过HttpURLConnection上传文件到服务器

    一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HTTP API作为后台上传接口,android客户端我选择用HttpURLConnection来通过form提交文件数据实现上传功能,本来想网上搜搜拷贝一下改改代码就好啦,发现根本没有现成的例子,多数的例子都是基于HttpClient的或者是基于Base64编码以后作为字符串来传输图像数据,于是我不得不自己动手,参考了网上一些资料,最终实现基于HttpURLConnect

  • Android HttpURLConnection.getResponseCode()错误解决方法

    导语:个人对网络连接接触的不多,在使用时自己发现一些问题,记录一下. 正文:我在使用HttpURLConnection.getResponseCode()的时候直接报错是IOException错误,responseCode = -1.一直想不明白,同一个程序我调用了两次,结果有一个链接一直OK,另一个却一直报这个错误.后来发现两个链接的区别,有一个返回的内容是空的,所以导致了这个错误. 解决方法: 方法1.网页返回内容不能是空: 方法2.不要用这个接口咯.

  • Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数据交互,小编刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个坑,总结下最常用的就通过HttpURLConnection来POST提交JSON数据与

  • 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.IO

  • android实现文件下载功能

    android 在网络上下载文件,供大家参考,具体内容如下 步骤 : 1.使用HTTP协议下载文件 - 创建一个HttpURLConnection对象 : HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); - 获取一个InputStream对象 : urlConn.getInputStream() - 访问网络的权限 : android.permission.INTERNET 2.将下载的文件写入SDCAR

  • 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; im

  • java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 其实apache中的ant包(请自行GOOGLE之ant.jar)中有一个更好的类,已经支持中文了,我们就不重复制造轮子了,拿来用吧, 这里最主要的功能是实现了 可以指定多个文件 到同一个压缩包的功能 用org.apache.tools.zip压缩/解压缩zip文件的例子,用来解决中文乱码问题. 实例代码: import Java.io.BufferedInputStream; import java.io.

  • Android中文件的压缩和解压缩实例代码

    使用场景 当我们在应用的Assets目录中需要加入文件时,可以直接将源文件放入,但这样会造成打包后的apk整体过大,此时就需要将放入的文件进行压缩.又如当我们需要从服务器中下载文件时,如果下载源文件耗时又消耗流量,较大文件需要压缩,可以使得传输效率大大提高.下面我们就学习下基本的文件压缩和解压缩.Java中提供了压缩和解压缩的输入输出流 public static void zip(String src,String dest) throwsIOException { //定义压缩输出流 Zip

  • zlib库压缩和解压字符串STL string的实例详解

    zlib库压缩和解压字符串STL string的实例详解 场景 1.一般在使用文本json传输数据, 数据量特别大时,传输的过程就特别耗时, 因为带宽或者socket的缓存是有限制的, 数据量越大, 传输时间就越长. 网站一般使用gzip来压缩成二进制. 说明 1.zlib库可以实现gzip和zip方式的压缩, 这里只介绍zip方式的二进制压缩, 压缩比还是比较可观的, 一般写客户端程序已足够. 2.修改了一下zpipe.c的实现, 其实就是把读文件改为读字符串, 写文件改为写字符串即可. 例子

  • Java实现文件压缩为zip和解压zip压缩包

    目录 压缩成.zip 解压.zip 压缩成.zip 代码如下: /** * 压缩成ZIP * * @param srcDir 压缩文件夹路径 * @param out 压缩文件输出流 * @throws RuntimeException 压缩失败会抛出运行时异常 */ public static void toZip(String srcDir, OutputStream out) throws RuntimeException { long start = System.currentTime

  • Java对zip,rar,7z文件带密码解压实例详解

    目录 前言 实现代码 1.pom.xml 2.zip解压 3.rar解压 4.7z解压 5.解压统一入口封装 6.测试代码 补充 前言 在一些日常业务中,会遇到一些琐碎文件需要统一打包到一个压缩包中上传,业务方在后台接收到压缩包后自行解压,然后解析相应文件.而且可能涉及安全保密,因此会在压缩时带上密码,要求后台业务可以指定密码进行解压. 应用环境说明:jdk1.8,maven3.x,需要基于java语言实现对zip.rar.7z等常见压缩包的解压工作. 首先关于zip和rar.7z等压缩工具和压

  • 使用java API实现zip递归压缩和解压文件夹

    一.概述 在本篇文章中,给大家介绍一下如何将文件进行zip压缩以及如何对zip包解压.所有这些都是使用Java提供的核心库java.util.zip来实现的. 二.压缩文件 首先我们来学习一个简单的例子-压缩单个文件.将一个名为test1.txt的文件压缩到一个名为Compressed.zip的zip文件中. public class ZipFile { public static void main(String[] args) throws IOException { //输出压缩包 Fil

  • Swift实现文件压缩和解压示例代码

    项目中有时候需要文件下载解压,项目中选择了ZipArchive,实际使用也比较简单,直接调用解压和压缩方法即可. 压缩 @IBAction func zipAction(_ sender: UIButton) { let imageDataPath = Bundle.main.bundleURL.appendingPathComponent("FlyElephant").path zipPath = tempZipPath() let success = SSZipArchive.cr

随机推荐