需求,将指定目录下的文件及文件夹压缩成一个指定赔案号
为名称,以".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);}
}