Android zip文件下載和解壓

jopen 10年前發布 | 38K 次閱讀 Android 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);  
        }  

    }  
}  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959550073455346514" target="_blank"></a></div>

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

    }  
}  </pre> <p> </p>

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

} </pre></div> </div> </div> 來自:http://blog.csdn.net/heqiangflytosky/article/details/17757097

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!