解压缩文件
public void showUnzipDialog() { new AlertDialog.Builder(this).setTitle("确认") .setMessage("是否解压?") .setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub doZipExtractorWork(); } }) .setNegativeButton("否", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }) .show(); } public void doZipExtractorWork() { ZipExtractorTask task = new ZipExtractorTask("/mnt/sdcard/test.zip", "/mnt/sdcard/test", this, true); task.execute(); }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);//zip 文件路径 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; } /** * 获取 大小 * * @param file * @return */ 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); } } }