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();
		//使用1Mbuffer
		byte[] 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 block
							e.printStackTrace();
						}
						dialog.cancel();//解压完成后关闭对话框
					}					
				}.start();
			}
		});
    }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}
}

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


Android将assets中的zip压缩文件解压到SD卡
 
Android将assets中的zip压缩文件解压到SD卡
 解压后发现SD卡上创建了output文件夹,所有文件和目录成功解压.

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

你可能感兴趣的:(android)