由於工做的時候用到了 ,本身又不是,搜索到以後,作個備份java
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(); } //此處爲個人需求 //Message msg = new Message(); // msg.what = 1; //handler.sendMessage(msg); if (isCancelled()) return; } @Override protected void onPreExecute() { // TODO Auto-generated method stub //super.onPreExecute(); if (mDialog != null) { mDialog.setTitle("解壓zip"); mDialog.setMessage(mInput.getName()); mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mDialog.setOnCancelListener(new DialogInterface.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); } } }
使用ide
ZipExtractorTask task = new ZipExtractorTask("zip包所在目錄", "解壓目錄", mContext, true); task.execute();