package com.ytd.ebos.platform.zjmb.controller; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.zip.CRC32; import java.util.zip.CheckedInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; /** * @author Administrator ZIP 解压缩工具包 */ /** * @author Administrator * */ public class ZipUtils { /** * Default buff byte size * */ private static final int DEFAULT_BUFF_SIZE = 1024; /** * Default basedir value * */ private static final boolean DEFAULT_DIR = false; /** // 解压操作,程序入口1,输入需要解压的文件全路径,然后在当前文件夹下面解压出文件 * @param srcPath * @throws Exception */ public static void decompress(String srcPath) throws Exception { decompress(new File(srcPath)); } /** // 解压操作,程序入口2,输入需要解压的文件File类,然后在当前文件夹下面解压出文件 * @param srcFile * @throws Exception */ public static void decompress(File srcFile) throws Exception { File baseFile = srcFile.getParentFile();//输出上层目录 decompress(srcFile, baseFile); } /** // 解压操作,程序入口3 ,输入需要解压的的文件全路径,以及解压到目的文件全路径 * @param srcPath * @param destPath * @throws Exception */ public static void decompress(String srcPath, String destPath) throws Exception { decompress(new File(srcPath), new File(destPath)); } /** // 解压操作,程序入口4,输入需要解压的文件File类,输入目的文件夹File类 * @param srcFile * @param destFile * @throws Exception */ public static void decompress(File srcFile, File destFile) throws Exception { CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32()); ZipInputStream zis = new ZipInputStream(cis); // 如果是multipartFile,可以使用如下方法取得zipInputStream // InputStream inputStream = multipartFile.getInputStream(); // ZipInputStream zis = new ZipInputStream(new BufferedInputStream(inputStream),Charset.forName("UTF-8")); doDecompress(destFile, zis); zis.close(); } /**解压操作,输入目的文件夹File类(解压后放置文件的目录),输入压缩文件流 * @param destFile * @param zis * @throws Exception */ private static void doDecompress(File destFile, ZipInputStream zis) throws Exception { ZipEntry zipEntry = null; while ((zipEntry = zis.getNextEntry()) != null) { String dir = destFile.getPath() + File.separator + zipEntry.getName(); File dirFile = new File(dir); fileProber(dirFile); // 解压出来的是文件文件夹,则直接创建 if (zipEntry.isDirectory()) { dirFile.mkdirs(); } else { doDecompressFile(dirFile, zis); } zis.closeEntry(); } } /**解压操作,边读边写,把输入流程写到文件 * @param destFile * @param zis * @throws Exception */ private static void doDecompressFile(File destFile, ZipInputStream zis) throws Exception { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile)); int len; byte[] buff = new byte[DEFAULT_BUFF_SIZE]; while ((len = zis.read(buff, 0, DEFAULT_BUFF_SIZE)) != -1) { bos.write(buff, 0, len); } bos.close(); } /** * 文件探测,如果没有父级文件夹,则一直创建 * * When the parent file not exist.Create it. * Prober 英 ['prəʊbə] 美 ['proʊbə] n. 探查者;探测器 * @param dirFile * @throws Exception */ public static void fileProber(File dirFile) throws Exception { File parentFile = dirFile.getParentFile(); if (!parentFile.exists()) { fileProber(parentFile); parentFile.mkdirs(); } } /** * 压缩操作,程序入口1 * @param srcPath 需要压缩的文件夹或者文件全路径 * @param destPath 压缩后生成的文件全路径 * @param dirFlag 是否使用默认文件夹名作为所有生成压缩文件的父级文件夹,不输入则为false * @throws Exception */ public static void compress(String srcPath, String destPath, boolean dirFlag) throws Exception { compress(new File(srcPath), new File(destPath), dirFlag); } /**压缩操作,程序入口2 * @param srcPath 需要压缩的文件夹或者文件全路径 * @param destPath 压缩后生成的文件全路径 * @throws Exception */ public static void compress(String srcPath, String destPath) throws Exception { compress(new File(srcPath), new File(destPath), DEFAULT_DIR); } /**压缩操作,程序入口2 * @param srcFile 需要压缩的文件夹或者文件 file类 * @param destFile 压缩后生成的文件file类 * @param dirFlag 是否使用默认文件夹名作为所有生成压缩文件的父级文件夹 ,不输入则为false * @throws Exception */ public static void compress(File srcFile, File destFile, boolean dirFlag) throws Exception { // file类转压缩输出流ZipOutputStream compress(srcFile, new ZipOutputStream(new FileOutputStream(destFile)), dirFlag); } /** * @param srcFile 需要压缩的文件夹或者文件 file类 * @param zos 压缩输出流 * @param dirFlag 是否使用默认文件夹名作为所有生成压缩文件的父级文件夹,不输入则为false * @throws Exception */ public static void compress(File srcFile, ZipOutputStream zos, boolean dirFlag) throws Exception { // 如果是目录 if (srcFile.isDirectory()) { if (dirFlag) { doCompress(zos, srcFile, srcFile.getName() + File.separator); } else { doCompress(zos, srcFile, ""); } // 如果是文件直接压缩 } else { doCompress(zos, srcFile, ""); } zos.close(); } /** * @param zos 压缩输出流 * @param file 需要压缩的文件夹或者文件 file类 * @param baseDir 所有压缩文件的 父级文件夹名 * @throws Exception */ public static void doCompress(ZipOutputStream zos, File file, String baseDir) throws Exception { if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { doCompress(zos, files[i], baseDir); } } else { byte[] buff = new byte[DEFAULT_BUFF_SIZE]; InputStream in = new FileInputStream(file); zos.putNextEntry(new ZipEntry(baseDir + File.separator + file.getName())); int len; while ((len = in.read(buff, 0, DEFAULT_BUFF_SIZE)) != -1) { zos.write(buff, 0, len); } in.close(); } } public static void main(String[] args) throws Exception{ String dir = "C:\Users\Administrator\Desktop\test\" ; String src = "C:\Users\Administrator\Desktop\缺少定值清单.zip" ; // 解压测试 // decompress(src); // decompress(src,dir); // 压缩测试,如果有子文件夹,也还是全部压缩到了总的文件夹,并没有按子文件夹在压缩在里面 String deskPath = "C:\Users\Administrator\Desktop\deskPath.zip" ; // compress(dir, deskPath, true);//压缩包文件名为deskPath,内含文件test compress(dir, deskPath, true);//压缩包文件名为deskPath,压缩包内没有总的文件夹,直接就是压缩文件 } }
相关知识:
https://www.yiibai.com/javazip/javazip_zipoutputstream.html#article-start
java.util.zip.ZipEntry类用于表示ZIP文件条目。
java.util.zip.ZipFile类用于读取zip文件中的条目。
java.util.zip.ZipInputStream类实现用于读取ZIP文件格式文件的输入流过滤器。 包括对压缩和未压缩条目的支持。
java.util.zip.ZipOutputStream类实现一个输出流过滤器,用于以ZIP文件格式写入文件。 包括对压缩和未压缩条目的支持。