public void unZip(File zipFile, String dest) throws Exception {
try {
// 首先创建ZipFile指向磁盘上的.zip文件
ZipFile zFile = new ZipFile(zipFile);
String encoding = "UTF-8";
zFile.setFileNameCharset(encoding);
// 检查时候有乱码情况,如果有变为GBK格式
List list = zFile.getFileHeaders();
for (int i = 0; i < list.size(); i++) {
FileHeader fileHeader = (FileHeader) list.get(i);
String fileName = fileHeader.getFileName();
if (isMessyCode(fileName)) {
encoding = "GBK";
break;
}
}
// 需新建一个ZipFile对象,才能重新设置编码格式
ZipFile zFile1 = new ZipFile(zipFile);
zFile1.setFileNameCharset(encoding);
// 验证.zip文件是否合法,包括文件是否存在、是否为zip文件、是否被损坏等
if (!zFile1.isValidZipFile()) {
throw new PeException("文件可能已经被损坏!请重新打包尝试!");
}
// 解压目录
File destDir = new File(dest);
if (destDir.isDirectory() && !destDir.exists()) {
destDir.mkdir();
}
zFile1.extractAll(dest);
} catch (ZipException e) {
throw new Exception("解析压缩文件过程中出现错误!!");
}
}
private static boolean isMessyCode(String str) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// 当从Unicode编码向某个字符集转换时,如果在该字符集中没有对应的编码,则得到0x3f(即问号字符?)
// 从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd
if ((int) c == 0xfffd) {
// 存在乱码
return true;
}
}
return false;
}