Android将assets中的zip压缩文件解压到SD卡

程序首先要获取写外部存储权限:

程序:

package com.hu.andstar;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import android.content.Context;public class UnzipAssets {/** * 解压assets的zip压缩文件到指定目录 * @param context上下文对象 * @param assetName压缩文件名 * @param outputDirectory输出目录 * @param isReWrite是否覆盖 * @throws IOException */public static void unZip(Context context, String assetName,String outputDirectory,boolean isReWrite) throws IOException {//创建解压目标目录File file = new File(outputDirectory);//如果目标目录不存在,则创建if (!file.exists()) {file.mkdirs();}//打开压缩文件InputStream inputStream = context.getAssets().open(assetName);ZipInputStream zipInputStream = new ZipInputStream(inputStream);//读取一个进入点ZipEntry zipEntry = zipInputStream.getNextEntry();//使用1Mbufferbyte[] buffer = new byte[1024 * 1024];//解压时字节计数int count = 0;//如果进入点为空说明已经遍历完所有压缩包中文件和目录while (zipEntry != null) {//如果是一个目录if (zipEntry.isDirectory()) {file = new File(outputDirectory + File.separator + zipEntry.getName());//文件需要覆盖或者是文件不存在if(isReWrite || !file.exists()){file.mkdir();}} else {//如果是文件file = new File(outputDirectory + File.separator+ zipEntry.getName());//文件需要覆盖或者文件不存在,则解压文件if(isReWrite || !file.exists()){file.createNewFile();FileOutputStream fileOutputStream = new FileOutputStream(file);while ((count = zipInputStream.read(buffer)) > 0) {fileOutputStream.write(buffer, 0, count);}fileOutputStream.close();}}//定位到下一个文件入口zipEntry = zipInputStream.getNextEntry();}zipInputStream.close();}}

该方法可以将指定压缩包中所有文件和目录解压到指定的路径:

在MainActivity中只需作如下处理:

package com.hu.unzipdemo;import java.io.IOException;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.os.Environment;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {Button btUnzip = null;//设置解压目的路径public static String OUTPUT_DIRECTORY = Environment.getExternalStorageDirectory().getAbsolutePath() + "/output";@Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btUnzip = (Button)findViewById(R.id.buttonUnzip);                btUnzip.setOnClickListener(new OnClickListener() {ProgressDialog dialog = new ProgressDialog(MainActivity.this);public void onClick(View v) {dialog.setTitle("提示");dialog.setMessage("正在解压文件,请稍后!");dialog.show();//显示对话框new Thread(){public void run() {//在新线程中以同名覆盖方式解压try {UnZipAssets.unZip(MainActivity.this, "res.zip", OUTPUT_DIRECTORY, true);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}dialog.cancel();//解压完成后关闭对话框}}.start();}});    }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}}

压缩包放在项目的assets文件夹下:





解压后发现SD卡上创建了output文件夹,所有文件和目录成功解压.

由于很多文件直接放在assets里打包apk时会被自动压缩,从而在拷贝出来时会发生错误,将这些文件打包成zip后不但可以减小apk的大小,还不会出错。