Android将assets中的zip压缩文件解压到SD卡
16lz
2022-05-28
程序首先要获取写外部存储权限:
程序:
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的大小,还不会出错。
更多相关文章
- android(7)(写数据权限)
- Android(安卓)MIME类型与文件后缀名匹配部分
- Android获取网络视频文件缩略图
- android用于打开各种文件的intent
- Android拍照、录像、录音代码范例
- 〖Android〗酷派手机固件.cpb文件的分解程序
- Android常用语句收集
- Android(安卓)Error:Could not open cp_proj remapped class cach
- NPM 和webpack 的基础使用