Android zip文件下载和解压

jopen 10年前

下载:

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

解压:

ZipExtractorTask .java
</div> </div>
    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();        }        }  
</div> </div> 来自:http://blog.csdn.net/heqiangflytosky/article/details/17757097