java 时限压缩zip的几种方案

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

    /**
     * 压缩指定文件或者文件夹
     * 

* 压缩文件夹,压缩包中包含自己本身这一级文件夹 * 例如: * 压缩后的zip包名: a.zip * 压缩目录: D:\1\ * 压缩完成后:a.zip 包中包含1这一级文件夹 *

* * @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); } } /** * /** * 压缩指定文件或者文件夹 *

* 压缩文件夹,压缩包中包含自己本身这一级文件夹 * 例如: * 压缩后的zip包名: a.zip * 压缩目录: D:\1\ * 压缩完成后:a.zip 包中不包含1这一级文件夹 *

* * @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); } } /** * 判断传参类型:是目录还是文件 *

* 1.如果是文件,则调用压缩文件方法 * 2.如果是目录,则调用压缩目录方法 *

* * @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); } } /** * 压缩指定文件或者文件夹 *

* 压缩文件夹,压缩包中包含自己本身这一级文件夹 * 例如: * 压缩后的zip包名: a.zip * 压缩目录: D:\1\ * 压缩完成后:a.zip 包中包含1这一级文件夹 *

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

你可能感兴趣的:(Java,zip压缩)