转载自 http://blog.youkuaiyun.com/chaoyu168/article/details/53787157
网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,在此记录一下下载zip文件并直接解压的方法,直接上代码。
源码下载:http://download.youkuaiyun.com/detail/chaoyu168/9717756
下载:
- 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" />