package com.jk.Md5;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* @author Dana·Li
* <p>
* 程序实现了ZIP解压[decompression]
* <p>
* 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。
* <p>
* 在本段代码中,实现的是解压部分;
*/
public class ZipUtil {
public static void main(String[] args) throws IOException {
String file = "D:\\a\\a\\EXCPTACCTF_20191003_108135.zip";
int unZip = ZipUtil.unZip(file);
System.out.println(unZip);
}
public static int unZip(String zipfile) throws IOException {
// 标识文件个数
int sum = 0;
// 检查是否是zip文件,并判断文件是否存在
checkFileName(zipfile);
File zfile = new File(zipfile);
// 获取待解压文件的父路径
String Parent = zfile.getParent() + "\\";
FileInputStream fis = new FileInputStream(zfile);
Charset charset = Charset.forName("GBK");// 默认UTF-8
// CheckedInputStream cis = new CheckedInputStream(fis,new CRC32());
ZipInputStream zis = new ZipInputStream(fis, charset);// 输入源zip路径
ZipEntry entry = null;
BufferedOutputStream bos = null;
String[] split = zipfile.split("\\\\");
File file1 = new File(Parent + split[split.length - 1].split("\\.")[0]);
file1.mkdirs();
while ((entry = zis.getNextEntry()) != null) {
File filePath = new File(file1 + "\\" + entry.getName());
if (filePath.isDirectory())
continue;
// 如果目录不存在,则创建
File f1 = null;
String f2 = null;
if (!filePath.exists()) {
String str = entry.getName();
String[] split2 = str.split("/");
if (split2.length > 1) {
f1 = new File(file1 + "\\" + split2[0]);
f2 = sum + split2[1];
f1.mkdirs();
filePath = new File(f1 + "\\" + f2);
} else {
filePath = new File(file1 + "\\" + sum + entry.getName());
}
}
System.out.println(filePath.isDirectory());
if (!filePath.isDirectory()) {
FileOutputStream fos = new FileOutputStream(filePath);
bos = new BufferedOutputStream(fos);
byte buf[] = new byte[1024];
int len;
while ((len = zis.read(buf)) != -1) {
bos.write(buf, 0, len);
}
zis.closeEntry();
// 关闭的时候会刷新
bos.close();
}
sum++;
}
zis.close();
return sum;
}
private static void checkFileName(String name) {
// 文件是否存在
if (!new File(name).exists()) {
System.err.println("要解压的文件不存在!");
System.exit(1);
}
// 判断是否是zip文件
int index = name.lastIndexOf(".");
String str = name.substring(index + 1);
if (!"zip".equalsIgnoreCase(str)) {
System.err.println("不是zip文件,无法解压!");
System.exit(1);
}
}
}