package com.jspxcms.common.util;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.Queue;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
/**
* Ant Zip工具类
*
* @author liufang
*
*/
public class AntZipUtils {
private static final Logger logger = LoggerFactory
.getLogger(AntZipUtils.class);
private static final int DEFAULT_BUFFER_SIZE = 8192;
private static final String DEFAULT_ENCODING = "GBK";
public static boolean isZipFile(File file) {
String extension = FilenameUtils.getExtension(file.getName());
return "zip".equalsIgnoreCase(extension);
}
public static void zip(File[] srcFiles) {
zip(srcFiles, null, DEFAULT_ENCODING);
}
public static void zip(File[] srcFiles, OutputStream os) {
zip(srcFiles, os, null, DEFAULT_ENCODING);
}
public static void zip(File[] srcFiles, FileFilter filter, String encoding) {
Assert.notEmpty(srcFiles);
File destFile = new File(srcFiles[0].getParentFile(),
srcFiles[0].getName() + ".zip");
zip(srcFiles, destFile, filter, encoding);
}
public static void zip(File[] srcFiles, File destFile, FileFilter filter,
String encoding) {
try {
FileOutputStream fos = new FileOutputStream(destFile);
zip(srcFiles, fos, filter, encoding);
} catch (FileNotFoundException e) {
logger.error("", e);
}
}
public static void zip(File[] srcFiles, OutputStream os, FileFilter filter,
String encoding) {
Assert.notEmpty(srcFiles);
String root = srcFiles[0].getParentFile().getAbsolutePath();
int rootLength = root.length() + 1;
Queue<File> queue = new LinkedList<File>();
for (File f : srcFiles) {
queue.offer(f);
}
File file;
String name;
FileInputStream fin = null;
byte[] buff = new byte[DEFAULT_BUFFER_SIZE];
int readed;
ZipOutputStream zos = new ZipOutputStream(os);
if (StringUtils.isNotBlank(encoding)) {
zos.setEncoding(encoding);
}
try {
try {
while (!queue.isEmpty()) {
file = queue.poll();
name = file.getAbsolutePath().substring(rootLength);
name = name.replace(File.separatorChar, '/');
if (file.isDirectory()) {
zos.putNextEntry(new ZipEntry(name + '/'));
zos.closeEntry();
for (File f : file.listFiles(filter)) {
queue.offer(f);
}
} else {
zos.putNextEntry(new ZipEntry(name));
fin = new FileInputStream(file);
while ((readed = fin.read(buff)) > 0) {
zos.write(buff, 0, readed);
}
fin.close();
zos.closeEntry();
}
}
} finally {
if (fin != null) {
fin.close();
}
zos.close();
}
} catch (IOException e) {
logger.error("", e);
}
}
public static void unzip(File zipFile, File destDir) {
unzip(zipFile, destDir, DEFAULT_ENCODING);
}
public static void unzip(File zipFile, File destDir, String encoding) {
if (destDir.exists() && !destDir.isDirectory()) {
throw new IllegalArgumentException("destDir is not a directory!");
}
ZipFile zip = null;
InputStream is = null;
FileOutputStream fos = null;
File file;
String name;
byte[] buff = new byte[DEFAULT_BUFFER_SIZE];
int readed;
ZipEntry entry;
try {
try {
if (StringUtils.isNotBlank(encoding)) {
zip = new ZipFile(zipFile, encoding);
} else {
zip = new ZipFile(zipFile);
}
Enumeration<?> en = zip.getEntries();
while (en.hasMoreElements()) {
entry = (ZipEntry) en.nextElement();
name = entry.getName();
name = name.replace('/', File.separatorChar);
file = new File(destDir, name);
if (entry.isDirectory()) {
file.mkdirs();
} else {
// 创建父目录
file.getParentFile().mkdirs();
is = zip.getInputStream(entry);
fos = new FileOutputStream(file);
while ((readed = is.read(buff)) > 0) {
fos.write(buff, 0, readed);
}
fos.close();
is.close();
}
}
} finally {
if (fos != null) {
fos.close();
}
if (is != null) {
is.close();
}
if (zip != null) {
zip.close();
}
}
} catch (IOException e) {
logger.error("", e);
}
}
}