package com.ots.project.tool.exam;
|
import lombok.extern.slf4j.Slf4j;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.FileOutputStream;
|
import java.io.IOException;
|
import java.io.OutputStream;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipOutputStream;
|
|
@Slf4j
|
public class ZipUtil {
|
private static final int BUFFER_SIZE = 2 * 1024;
|
|
public static void toZip(String srcDir, OutputStream out, boolean keepDirStructure)
|
throws RuntimeException {
|
long start = System.currentTimeMillis();
|
ZipOutputStream zos = null;
|
try {
|
zos = new ZipOutputStream(out);
|
File sourceFile = new File(srcDir);
|
compress(sourceFile, zos, sourceFile.getName(), keepDirStructure);
|
long end = System.currentTimeMillis();
|
System.out.println("压缩完成,耗时:" + (end - start) + " ms");
|
} catch (Exception e) {
|
throw new RuntimeException("zip error from ZipUtils", e);
|
} finally {
|
if (zos != null) {
|
try {
|
zos.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
|
public static void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {
|
long start = System.currentTimeMillis();
|
ZipOutputStream zos = null;
|
try {
|
zos = new ZipOutputStream(out);
|
for (File srcFile : srcFiles) {
|
zipFile(zos, srcFile);
|
}
|
long end = System.currentTimeMillis();
|
} catch (Exception e) {
|
e.printStackTrace();
|
throw new RuntimeException("zip error from ZipUtils", e);
|
} finally {
|
if (zos != null) {
|
try {
|
zos.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
private static void zipFile(ZipOutputStream zos, File srcFile) throws IOException {
|
FileInputStream in = null;
|
try {
|
in = new FileInputStream(srcFile);
|
byte[] buf = new byte[BUFFER_SIZE];
|
zos.putNextEntry(new ZipEntry(srcFile.getName()));
|
int len;
|
while ((len = in.read(buf)) != -1) {
|
zos.write(buf, 0, len);
|
}
|
} catch (Exception e) {
|
log.error("zipFile error:{}",e.getMessage(),e);
|
}finally {
|
zos.closeEntry();
|
if (Objects.nonNull(in)) {
|
in.close();
|
}
|
}
|
}
|
|
private static void compress(File sourceFile, ZipOutputStream zos, String name,
|
boolean keepDirStructure) throws Exception {
|
byte[] buf = new byte[BUFFER_SIZE];
|
if (sourceFile.isFile()) {
|
|
zos.putNextEntry(new ZipEntry(name));
|
|
int len;
|
FileInputStream in = new FileInputStream(sourceFile);
|
while ((len = in.read(buf)) != -1) {
|
zos.write(buf, 0, len);
|
}
|
|
zos.closeEntry();
|
in.close();
|
} else {
|
File[] listFiles = sourceFile.listFiles();
|
if (listFiles == null || listFiles.length == 0) {
|
|
if (keepDirStructure) {
|
|
zos.putNextEntry(new ZipEntry(name + "/"));
|
|
zos.closeEntry();
|
}
|
} else {
|
for (File file : listFiles) {
|
|
if (keepDirStructure) {
|
|
|
compress(file, zos, name + "/" + file.getName(), keepDirStructure);
|
} else {
|
compress(file, zos, file.getName(), keepDirStructure);
|
}
|
}
|
}
|
}
|
}
|
public static void main(String[] args) throws Exception {
|
|
FileOutputStream fos1 = new FileOutputStream(new File("H:\\xuweichao.zip"));
|
ZipUtil.toZip("H:\\docTmp", fos1, true);
|
}
|
}
|