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 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); } }