将文件解压 android,带你走进Android之基础篇--文件解压缩

嗨,你终于来啦~

等你好久啦~

从今天开始每天分享一篇 Android 需要了解的知识点,喜欢的小伙伴欢迎关注,我会定期分享Android知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。

最近会贡献一些平时开发中积累下来的 工具 类,希望能免去大家造轮子的体力活。

今天贡献一个解压缩zip文件的工具。

关键类

可以归纳起来所有跟文件操作相关的流程都要下面这几个类

File

InputStream

OutputStream

解压缩也一样,用于解压缩的工具类是这三个,

ZipFile

ZipInputStream

FileOutputStream

解压缩流程

首先实例化ZipFile对象,

通过InputStream读取流,ZipInputStream提供了一个方法

getNextEntry()

返回一个 ZipEntry对象。这个对象所表示的意义是压缩/解压的文件信息,可以是文件夹,也可以是文件。

所以在获取ZipEntry的之后,如果用 getName()拿它的文件名的话,

会以路径+文件名的形式呈现。

比方我们现在有压缩文件 test.zip,

源文件 test/ 下面存在这么个层级结构,

test/a/b/c/file.txt

那么在解压缩的时候,我们拿到的file.txt的 ZipEntry的 name会是下面这样

a/b/c/file.txt

ZipEntry 的获取是在循环里不断迭代的,

而我们所获取到的 ZipEntry不仅会包括 file.txt文件,

同时也包括 a、b、c三个文件夹,

这也是为什么下面给出的工具类里会有这段代码的原因。

String fileName = zipEntry.getName();

if(fileName != null && fileName.contains(MAC_IGNORE)) {

continue;

}

File temp = new File(targetPath + File.separator + fileName);

if(zipEntry.isDirectory()) {

File dir = new File(targetPath + File.separator + fileName);

dir.mkdirs();

continue;

}

if (temp.getParentFile() != null && !temp.getParentFile().exists()) {

temp.getParentFile().mkdirs();

}

复制代码

完整代码

解压缩的思路在上面已经描述了,下面给出完整代码:

public class UnzipUtil {

//过滤在mac上压缩时自动生成的__MACOSX文件夹

private static final String MAC_IGNORE = "__MACOSX/";

public static void decompressFile(String target, String source) {

if(TextUtils.isEmpty(target)){

return;

}

try {

File file = new File(source);

if(!file.exists()) {

return;

}

ZipFile zipFile = new ZipFile(file);

ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));

ZipEntry zipEntry = null;

while ((zipEntry = zipInputStream.getNextEntry()) != null) {

String fileName = zipEntry.getName();

if(fileName != null && fileName.contains(MAC_IGNORE)) {

continue;

}

File temp = new File(target + File.separator + fileName);

if(zipEntry.isDirectory()) {

File dir = new File(target + File.separator + fileName);

dir.mkdirs();

continue;

}

if (temp.getParentFile() != null && !temp.getParentFile().exists()) {

temp.getParentFile().mkdirs();

}

byte[] buffer = new byte[1024];

OutputStream os = new FileOutputStream(temp);

// 通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流

InputStream is = zipFile.getInputStream(zipEntry);

int len = 0;

while ((len = is.read(buffer)) != -1) {

os.write(buffer, 0, len);

}

os.close();

is.close();

}

zipInputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值