需求,将指定目录下的文件及文件夹压缩成一个指定赔案号为名称,以".zip"结尾的压缩包提供客户下载。
package com.gblfy.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包) * * @author gblfy * @date 2020-07-02 */ public class ZipCompressorUtil { static final int BUFFER = 8192; private File zipFile; public ZipCompressorUtil(String pathName) { zipFile = new File(pathName); } /** * 压缩指定文件或者文件夹 * <p> * 压缩文件夹,压缩包中包含自己本身这一级文件夹 * 例如: * 压缩后的zip包名: a.zip * 压缩目录: D:\1\ * 压缩完成后:a.zip 包中包含1这一级文件夹 * </p> * * @param pathName 传入一个或者多个文件/文件夹的绝对路径 可变参数 */ public void compressContainShell(String... pathName) { ZipOutputStream out = null; try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); out = new ZipOutputStream(cos); String basedir = ""; for (int i = 0; i < pathName.length; i++) { //循环遍历传入的文件或者文件夹的绝对路径的 可变参数 compress(new File(pathName[i]), out, basedir); } out.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 压缩指定文件或者文件夹 * * @param files */ public void compressContainShell(File[] files) { ZipOutputStream out = null; try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); out = new ZipOutputStream(cos); String basedir = ""; for (int i = 0; i < files.length; i++) { //循环遍历传入的文件或者文件夹的绝对路径的 可变参数 compress(files[i], out, basedir); } out.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * /** * 压缩指定文件或者文件夹 * <p> * 压缩文件夹,压缩包中包含自己本身这一级文件夹 * 例如: * 压缩后的zip包名: a.zip * 压缩目录: D:\1\ * 压缩完成后:a.zip 包中不包含1这一级文件夹 * </p> * * @param srcPathNameOrFileName */ public void compressNotContainShell(String srcPathNameOrFileName) { ZipOutputStream out = null; try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); out = new ZipOutputStream(cos); String basedir = ""; //循环遍历传入的文件或者文件夹的绝对路径的 可变参数 File dir = new File(srcPathNameOrFileName); if (!dir.exists()) { System.out.println("压缩目录不存在,请核实!"); return; } File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { compress(new File(String.valueOf(files[i])), out, basedir); } out.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 判断传参类型:是目录还是文件 * <p> * 1.如果是文件,则调用压缩文件方法 * 2.如果是目录,则调用压缩目录方法 * </p> * * @param file * @param out * @param basedir */ private void compress(File file, ZipOutputStream out, String basedir) { if (file.isDirectory()) { System.out.println("压缩:" + basedir + file.getName()); //调用压缩目录方法 this.compressDirectory(file, out, basedir); } else { System.out.println("压缩:" + basedir + file.getName()); //调用压缩文件方法 this.compressFile(file, out, basedir); } } /** * 压缩一个目录 * * @param dir 目录 * @param out zip输出流 * @param basedir 基础路径前缀 例如: 第一层 “” 第二层 / */ private void compressDirectory(File dir, ZipOutputStream out, String basedir) { if (!dir.exists()) { System.out.println("压缩目录不存在,请核实!"); return; } File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { /* 递归 */ compress(files[i], out, basedir + dir.getName() + "/"); } } /** *压缩一个文件 * * @param file 文件 * @param out zip输出流 * @param basedir 基础路径前缀 例如: 第一层 “” 第二层 / */ private void compressFile(File file, ZipOutputStream out, String basedir) { if (!file.exists()) { System.out.println("压缩文件不存在,请核实!"); return; } try { BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); ZipEntry entry = new ZipEntry(basedir + file.getName()); out.putNextEntry(entry); int count; byte data[] = new byte[BUFFER]; while ((count = bis.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 压缩指定文件或者文件夹 * <p> * 压缩文件夹,压缩包中包含自己本身这一级文件夹 * 例如: * 压缩后的zip包名: a.zip * 压缩目录: D:\1\ * 压缩完成后:a.zip 包中包含1这一级文件夹 * </p> * * @param srcPathNameOrFileName */ public void compressContainShell(String srcPathNameOrFileName) { File file = new File(srcPathNameOrFileName); if (!file.exists()) { throw new RuntimeException(srcPathNameOrFileName + "不存在!"); } try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); ZipOutputStream out = new ZipOutputStream(cos); String basedir = ""; compress(file, out, basedir); out.close(); } catch (Exception e) { throw new RuntimeException(e); } } //--------------------------------------------单元测试-------------------------------------------- public static void main(String[] args) { ZipCompressorUtil zc = new ZipCompressorUtil("D:/resource.zip"); String b = "D:\\1\\"; // // String b = "D:\\1.jpg"; zc.compressNotContainShell(b); // zc.compress("D:\\1.jpg", "D:\\3.jpeg", "D:\\4.jpg", b); } }企业内部线上:补充方案
package com.gblfy.test; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包) * * @author gblfy * @date 2020-07-02 */ public class ZipCompressorUtil2 { static final int BUFFER = 8192; /** * 判断传参类型:是目录还是文件 * <p> * 1.如果是文件,则调用压缩文件方法 * 2.如果是目录,则调用压缩目录方法 * </p> * * @param file * @param out * @param basedir */ private void compress(File file, ZipOutputStream out, String basedir) { if (file.isDirectory()) { System.out.println("压缩:" + basedir + file.getName()); //调用压缩目录方法 this.compressDirectory(file, out, basedir); } else { System.out.println("压缩:" + basedir + file.getName()); //调用压缩文件方法 this.compressFile(file, out, basedir); } } /** * 压缩一个目录 * * @param dir 目录 * @param out zip输出流 * @param basedir 基础路径前缀 例如: 第一层 “” 第二层 / */ private void compressDirectory(File dir, ZipOutputStream out, String basedir) { if (!dir.exists()) { System.out.println("压缩目录不存在,请核实!"); return; } File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { /* 递归 */ compress(files[i], out, basedir + dir.getName() + "/"); } } /** * 压缩一个文件 * * @param file 文件 * @param out zip输出流 * @param basedir 基础路径前缀 例如: 第一层 “” 第二层 / */ private void compressFile(File file, ZipOutputStream out, String basedir) { if (!file.exists()) { System.out.println("压缩文件不存在,请核实!"); return; } try { BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); ZipEntry entry = new ZipEntry(basedir + file.getName()); out.putNextEntry(entry); int count; byte data[] = new byte[BUFFER]; while ((count = bis.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * /** * 压缩指定文件或者文件夹 * <p> * 压缩文件夹,压缩包中包含自己本身这一级文件夹 * 例如: * 压缩后的zip包名: a.zip * 压缩目录: D:\1\ * 压缩完成后:a.zip 包中不包含1这一级文件夹 * </p> * * @param srcPathNameOrFileName */ public void compressNotContainShell(String srcPathNameOrFileName, String zipFilePath) { ZipOutputStream out = null; try { File zipFile = getZipName(zipFilePath); FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); out = new ZipOutputStream(cos); String basedir = ""; //循环遍历传入的文件或者文件夹的绝对路径的 可变参数 File dir = new File(srcPathNameOrFileName); if (!dir.exists()) { System.out.println("压缩目录不存在,请核实!"); return; } File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { compress(new File(String.valueOf(files[i])), out, basedir); } out.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 以 * @param pathName * @return */ public File getZipName(String pathName) { return new File(pathName); } //--------------------------------------------单元测试-------------------------------------------- public static void main(String[] args) { ZipCompressorUtil2 zc = new ZipCompressorUtil2(); String docPath = "D:\\22\\srcImgPath\\理赔报名类单证\\"; String zipFileName = "D:\\22\\srcImgPath\\123.zip"; zc.compressNotContainShell(docPath, zipFileName); // zc.compress("D:\\1.jpg", "D:\\3.jpeg", "D:\\4.jpg", b); } }