本文主要是介绍安卓 解压缩文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
解压缩文件
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); }} }
这篇关于安卓 解压缩文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!