广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    Android中实现下载和解压zip文件功能代码分享

    2018-04-13 09:17:43 次阅读 稿源:互联网
    广告

    本文提供了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文件下载和解压功能,希望对你有所帮助。

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告