`

Android 文件下载与解压缩

阅读更多
转载:http://blog.csdn.net/hopehe888999/article/details/19035373

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




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



  
 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();  
        }  
      
    }  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics