java解压apk(zip)文件

先放上测试代码
package action;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class UnZip {
public void unZip(String fileName, String filePath) throws Exception {
//生成压缩文件对象
ZipFile zipFile = new ZipFile(fileName);
//得到枚举,通过循环来读取zip中的一个个文件
Enumeration emu = zipFile.entries();
while (emu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) emu.nextElement();
// System.out.println(” “+entry.getName());
//判断是否是文件夹
if (entry.isDirectory()) {
//创建文件夹路径,并生成
File f= new File(filePath + entry.getName());
f.mkdirs();
// System.out.println(f.toString());
// System.out.println(“y”);
continue;
}
BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
// System.out.println(bis.toString()+” u”);
//不是文件夹,就是文件
File file = new File(filePath + entry.getName());
// System.out.println(file.getName()+” w”);
//得到文件的父目录
File parent = file.getParentFile();
// System.out.print(parent.toString());
// System.out.println(” z”);
//如果文件的父目录没有建立,那么先建立父目录的路径
if (parent != null && (!parent.exists())) {
parent.mkdirs();
// System.out.print(parent.toString());
// System.out.println(” x”);
}
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
// System.out.println(bos.toString()+ ” v”);
byte[] buf = new byte[1024];
int len = 0;
//read()是有返回读取字符长度,如果读到文件尾部,则返回-1
while ((len = bis.read(buf, 0, 1024)) != -1) {
fos.write(buf, 0, len);
}
bos.flush();
bos.close();
bis.close();
System.out.println(“”);
}
zipFile.close();
// return “unzip_success”;
}
public static void main(String[] args) throws Exception {
UnZip zi = new UnZip();
zi.unZip(“E:\bb.apk”,”E:\base\”);
}
}

1.mkdirs()和mkdir()的区别
假设你的E:盘下面什么也没有,那么
File file=new File(“E:\ww\zz\cc”);
用file.mkdirs()是可以把一连串的目录都给建好
但file.mkdir()就不行,它只能创建父目录下的一层文件,如
File file=new File(“E:\xx”); file.mkdir();这样是可以的

下面是我纪录这篇文章的重点:
关于这段代码
Enumeration emu = zipFile.entries();
while (emu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) emu.nextElement();

这种entry到底得到了什么,我测试了一下
anim-v21/
anim-v21/design_bottom_sheet_slide_in.xml

anim-v21/design_bottom_sheet_slide_out.xml

kotlin/comparisons/ComparisonsKt.kotlin_metadata

kotlin/comparisons/
kotlin/annotation/annotation/annotation.kotlin_builtins

kotlin/annotation/annotation/
kotlin/
kotlin/annotation/
AndroidManifest.xml

classes.dex

kotlin/Lazy.kotlin_metadata

kotlin/annotation/annotation.kotlin_builtins

resources.arsc

这是zip文件中的一段段路径
附上我的zip文件树形目录和entry的访问顺序这里写图片描述
一个个entry的遍历顺序我还不懂,这是什么遍历方法?

就是因为这种有点乱的遍历顺序
所以要先判断是不是文件夹,如果是,就建立路径
否则就是文件,那么就读取它,还要判断文件的父目录存不存在,不存在要先建立父目录路径,然后在读写父目录之下的文件。

总之这种方法毫无问题,可以放心用。

猜你喜欢

转载自blog.csdn.net/wzl_lzw/article/details/82664863
今日推荐