解压zip文件:
/**
* 解压zip文件
*
* @param targetPath 解压路径
* @param sourceFile 源文件
* @throws ZipException
*/
public static void unzipFiles(String targetPath, File sourceFile) throws ZipException, UnsupportedEncodingException {
ZipFile zipFile = new ZipFile(sourceFile);
zipFile.setCharset(Charset.forName(CHARSET_GBK));
log.info("begin unpack zip file:{}", sourceFile);
String extractedFile;
for (FileHeader fileHeader : zipFile.getFileHeaders()) {
extractedFile = fileHeader.getFileName();
// 如果是fileHeader的文件名是utf-8且zipFile的编码不为空且zipFile的编码不是utf-8,则重置zipFile的编码为utf-8
if (fileHeader.isFileNameUTF8Encoded() && zipFile.getCharset() != null
&& !CHARSET_UTF8.equalsIgnoreCase(zipFile.getCharset().name())) {
// 转换文件名
extractedFile = new String(extractedFile.getBytes(CHARSET_GBK), CHARSET_UTF8);
// 重置zipFile的编码
zipFile.setCharset(Charset.forName(CHARSET_UTF8));
// 重置fileHeader的文件名
fileHeader.setFileName(extractedFile);
} else if (zipFile.getCharset() != null && !CHARSET_GBK.equalsIgnoreCase(zipFile.getCharset().name())) {
zipFile.setCharset(Charset.forName(CHARSET_GBK));
}
zipFile.extractFile(fileHeader, targetPath, extractedFile);
}
log.info("unpack zip file success");
}
pom依赖:
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.2.8</version>
</dependency>