国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android實現下載zip壓縮文件并解壓的方法(附源碼)

2019-12-12 03:38:54
字體:
來源:轉載
供稿:網友

前言

其實在網上有很多介紹下載文件或者解壓zip文件的文章,但是兩者結合的不多,所以這篇文章在此記錄一下下載zip文件并直接解壓的方法,直接上代碼,文末有源碼下載。

下載:

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

解壓:

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

權限:

<uses-permission android:name="android.permission.INTERNET" />  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  <!-- 創建和刪除文件 -->  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  <!-- 寫文件 -->  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <uses-permission android:name="android.permission.READ_PHONE_STATE" />  <uses-permission android:name="android.permission.VIBRATE" />  <uses-permission android:name="android.permission.READ_APN_SETTINGS" />  <uses-permission android:name="android.permission.RESTART_PACKAGES"/>   <!-- 統計 -->  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  <uses-permission android:name="android.permission.READ_PHONE_STATE" />  <uses-permission android:name="android.permission.READ_LOGS" />  <uses-permission android:name="android.permission.WAKE_LOCK" />  <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> 

源碼下載:點擊這里

總結

以上就是這篇文章的全部內容了,希望這篇文章對各位Android開發者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網能帶來一定的幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 县级市| 太康县| 镇坪县| 长治县| 九龙坡区| 陇南市| 侯马市| 沛县| 江川县| 苏尼特右旗| 右玉县| 河北省| 石景山区| 鹤庆县| 民县| 勃利县| 喀什市| 红原县| 平遥县| 西盟| 怀来县| 勃利县| 朝阳市| 大宁县| 南丹县| 长武县| 理塘县| 胶州市| 英超| 长乐市| 雅江县| 远安县| 永福县| 甘泉县| 桦川县| 页游| 屯门区| 兴隆县| 叙永县| 察雅县| 临武县|