针对部分情况下中文名称解压乱码解决方案:
加入ant的pom,使用unZipByGBK方法
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.6</version>
</dependency>
package com.test.app.common.utils;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class CompressUtil {
public static int BUFFER_SIZE = 2048;
public static boolean zipPath(String sourcePath, String zipFilePath) {
boolean result = false;
ZipArchiveEntry entry = null;
ZipArchiveOutputStream zaos = null;
InputStream is = null;
try {
File path = new File(sourcePath);
if (path.exists() && path.isDirectory()) {
File zipFile = new File(zipFilePath);
zaos = new ZipArchiveOutputStream(zipFile);
File[] fileList = path.listFiles();
for (int i = 0; i < fileList.length; i++) {
File file = fileList[i];
if (file.isDirectory()) {
zipPathFile(file.getAbsolutePath(), "", zaos);
} else {
entry = new ZipArchiveEntry(file, file.getName());
zaos.setUseZip64(Zip64Mode.AsNeeded);
zaos.putArchiveEntry(entry);
is = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024 * 5];
int len = -1;
while((len = is.read(buffer)) != -1) {
zaos.write(buffer, 0, len);
}
is.close();
zaos.closeArchiveEntry();
}
}
result = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(zaos != null) {
zaos.close();
}
if (is != null)
is.close();
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
private static void zipPathFile(String sourcePath, String parentPath, ZipArchiveOutputStream zaos) throws Exception {
File path = new File(sourcePath);
ZipArchiveEntry entry = null;
if(StringUtils.isBlank(parentPath)) {
entry = new ZipArchiveEntry(path, path.getName());
} else {
entry = new ZipArchiveEntry(path, parentPath + File.separator + path.getName());
}
zaos.setUseZip64(Zip64Mode.AsNeeded);
zaos.putArchiveEntry(entry);
zaos.closeArchiveEntry();
File[] fileList = path.listFiles();
for (int i = 0; i < fileList.length; i++) {
File file = fileList[i];
if (file.isDirectory()) {
if(StringUtils.isBlank(parentPath)) {
zipPathFile(file.getAbsolutePath(), path.getName(), zaos);
} else {
zipPathFile(file.getAbsolutePath(), parentPath + File.separator + path.getName(), zaos);
}
} else {
if(StringUtils.isBlank(parentPath)) {
entry = new ZipArchiveEntry(file, path.getName() + File.separator + file.getName());
} else {
entry = new ZipArchiveEntry(file, parentPath + File.separator + path.getName() + File.separator + file.getName());
}
zaos.setUseZip64(Zip64Mode.AsNeeded);
zaos.putArchiveEntry(entry);
InputStream is = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024 * 5];
int len = -1;
while((len = is.read(buffer)) != -1) {
zaos.write(buffer, 0, len);
}
is.close();
zaos.closeArchiveEntry();
}
}
}
public static void zip(File[] files, String zipFilePath) {
if (files != null && files.length > 0) {
ZipArchiveOutputStream zaos = null;
try {
File zipFile = new File(zipFilePath);
zaos = new ZipArchiveOutputStream(zipFile);
zaos.setUseZip64(Zip64Mode.AsNeeded);
for(File file : files) {
if(file != null) {
ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file,file.getName());
zaos.putArchiveEntry(zipArchiveEntry);
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024 * 5];
int len = -1;
while((len = is.read(buffer)) != -1) {
zaos.write(buffer, 0, len);
}
zaos.closeArchiveEntry();
} catch(Exception e) {
throw new RuntimeException(e);
} finally {
if(is != null)
is.close();
}
}
}
zaos.finish();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if(zaos != null) {
zaos.close();
}
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
public static List<String> unZip(String filePath, String destDir) throws Exception {
File zipFile = new File(filePath);
if(StringUtils.isBlank(destDir)) {
destDir = zipFile.getParent();
}
destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
ZipArchiveInputStream is = null;
List<String> fileNames = new ArrayList<String>();
try {
is = new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE));
ZipArchiveEntry entry = null;
while ((entry = is.getNextZipEntry()) != null) {
fileNames.add(entry.getName());
if (entry.isDirectory()) {
File directory = new File(destDir, entry.getName());
directory.mkdirs();
} else {
OutputStream os = null;
try {
os = new BufferedOutputStream(new FileOutputStream(new File(destDir, entry.getName())), BUFFER_SIZE);
IOUtils.copy(is, os);
} finally {
IOUtils.closeQuietly(os);
}
}
}
} catch(Exception e) {
e.printStackTrace();
throw e;
} finally {
IOUtils.closeQuietly(is);
}
return fileNames;
}
public static List<String> unZipByGBK(String filePath, String destDir) throws Exception {
File zipFile = new File(filePath);
if(StringUtils.isBlank(destDir)) {
destDir = zipFile.getParent();
}
destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
ZipArchiveInputStream is = null;
List<String> fileNames = new ArrayList<String>();
try {
is = new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE),"GBK");
ZipArchiveEntry entry = null;
while ((entry = is.getNextZipEntry()) != null) {
fileNames.add(entry.getName());
if (entry.isDirectory()) {
File directory = new File(destDir, entry.getName());
directory.mkdirs();
} else {
OutputStream os = null;
try {
os = new BufferedOutputStream(new FileOutputStream(new File(destDir, entry.getName())), BUFFER_SIZE);
IOUtils.copy(is, os);
} finally {
IOUtils.closeQuietly(os);
}
}
}
} catch(Exception e) {
e.printStackTrace();
throw e;
} finally {
IOUtils.closeQuietly(is);
}
return fileNames;
}
}