最近会贡献一些平时开发中积累下来的工具类,但愿能免去你们造轮子的体力活。
今天贡献一个解压缩zip文件的工具。javascript
能够概括起来全部跟文件操做相关的流程都要下面这几个类java
首先实例化ZipFile对象,
经过InputStream读取流,ZipInputStream提供了一个方法面试
返回一个 ZipEntry对象。这个对象所表示的意义是压缩/解压的文件信息,能够是文件夹,也能够是文件。
因此在获取ZipEntry的以后,若是用 getName()拿它的文件名的话,
会以路径+文件名的形式呈现。
比方咱们如今有压缩文件 test.zip,
源文件 test/ 下面存在这么个层级结构,工具
test/a/b/c/file.txtui
那么在解压缩的时候,咱们拿到的file.txt的 ZipEntry的 name会是下面这样spa
a/b/c/file.txtcode
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();
}
复制代码
解压缩的思路在上面已经描述了,下面给出完整代码:ip
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();
}
}
}复制代码