package com.geostar.geostack.dib.util;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* ZipUtils
*/
public class ZipUtils {
private static final int BUFFER_SIZE = 1024 * 8;
/**
* 压缩zip包,默认包含最外层目录
*
* @param srcDir 压缩文件夹路径
* @param out 压缩文件输出流
* @throws RuntimeException 压缩失败会抛出运行时异常
*/
public static void toZip(String srcDir, OutputStream out)
throws RuntimeException {
toZip(srcDir, out, false);
}
/**
* 压缩zip包,当srcDir为目录,包含子文件夹或文件,并且discardParentDir为true时则丢弃最外层目录,即zip包目录层次丢弃srcDir本身
*
* @param srcDir 压缩文件夹路径
* @param out 压缩文件输出流
* @param discardParentDir 是否丢弃最外层目录
* @throws RuntimeException
*/
public static void toZip(String srcDir, OutputStream out, boolean discardParentDir)
throws RuntimeException {
System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(out);
File sourceFile = new File(srcDir);
File[] files = sourceFile.listFiles();
if (sourceFile.isDirectory() && files.length > 0 && discardParentDir) {
for (File file : files) {
compress(file, zos, file.getName());
}
} else {
compress(sourceFile, zos, sourceFile.getName());
}
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils", e);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 压缩zip包,当srcDir为目录,包含子文件夹或文件,并且discardParentDir为true时则丢弃最外层目录,即zip包目录层次丢弃srcDir本身
*
* @param srcDir 压缩文件夹路径
* @param zipFile zip包文件绝对路径
* @param discardParentDir 是否丢弃最外层目录
* @throws RuntimeException
* @throws FileNotFoundException
*/
public static void toZip(String srcDir, File zipFile, boolean discardParentDir)
throws RuntimeException, FileNotFoundException {
System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
OutputStream out = new FileOutputStream(zipFile);
try {
toZip(srcDir, out, discardParentDir);
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 压缩成ZIP 方法2
*
* @param srcFiles 需要压缩的文件列表
* @param out 压缩文件输出流
* @throws RuntimeException 压缩失败会抛出运行时异常
*/
public static void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {
System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
ZipOutputStream zos = null;
InputStream in = null;
try {
zos = new ZipOutputStream(out);
for (File srcFile : srcFiles) {
byte[] buf = new byte[BUFFER_SIZE];
zos.putNextEntry(new ZipEntry(srcFile.getName()));
int len;
in = new FileInputStream(srcFile);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
}
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils", e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 递归压缩方法
*
* @param sourceFile 源文件
* @param zos zip输出流
* @param name 压缩后的名称
* @throws Exception
*/
private static void compress(File sourceFile, ZipOutputStream zos, String name) throws IOException {
byte[] buf = new byte[BUFFER_SIZE];
if (sourceFile.isFile()) {
InputStream in = null;
try {
// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
zos.putNextEntry(new ZipEntry(name));
// copy文件到zip输出流中
int len;
in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
// Complete the entry
zos.closeEntry();
} catch (IOException e) {
if (in != null) {
in.close();
}
throw new IOException(e);
}
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles == null || listFiles.length == 0) {
// 空文件夹的处理
zos.putNextEntry(new ZipEntry(name + "/"));
// 没有文件,不需要文件的copy
zos.closeEntry();
} else {
for (File file : listFiles) {
// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
compress(file, zos, name + "/" + file.getName());
}
}
}
}
public static void toZip(String[] in, String out) throws RuntimeException, FileNotFoundException {
System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
List<File> fileList = new ArrayList<>();
for (String string : in) {
fileList.add(new File(string));
}
OutputStream os = new FileOutputStream(new File(out));
ZipUtils.toZip(fileList, os);
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
// String[] in = {"D:\\Program Files\\apache-maven-3.6.1\\lib\\cdi-api-1.0.jar", "D:\\Font-Awesome-4.7.0\\_config.yml"};
// String out = "C:\\Users\\Nihaorz\\Desktop\\123.zip";
// ZipUtils.toZip(in, out);
File zipFile = new File("C:\\Users\\Nihaorz\\Desktop\\maven.zip");
OutputStream os = new FileOutputStream(zipFile);
ZipUtils.toZip("D:\\Program Files\\apache-maven-3.6.1", os, true);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}