关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android实现zip文件下载和解压功能

    Android实现zip文件下载和解压功能

    2015-03-15 00:00:00 出处:杰瑞教育
    分享

    本文提供了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<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();
     }
    }

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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    如何删除自带的不常用应用为windows 7减负

    MySQL中多表删除方法

    改进的二值图像像素标记算法及程序实现

    windows 7 32位系统下手动修改磁盘属性例如M盘修改为F盘

    windows 7中怎么样在家庭组互传文件

    Linux应用集成MySQL数据库访问技巧

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。