首页 > 编程语言 >java 将文件夹进行压缩,按指定大小进行分卷压缩

java 将文件夹进行压缩,按指定大小进行分卷压缩

时间:2024-04-03 15:59:47浏览次数:27  
标签:分卷压缩 java String private length 文件夹 File new currentZipOutputStream

使用方法:

SplitZip splitZip = new SplitZip();
splitZip.start(file.getPath(),file.getPath());

package ext.xxx.util;

import java.io.*;
import java.util.zip.*;

import static org.apache.commons.lang3.StringUtils.isBlank;

/**
 * 分卷压缩工具
 */
public class SplitZip {
    private static final int MAX_ZIP_SIZE = 1024 * 1024 * 300; // 300MB,可以改为自己想要的大小
    private  ZipOutputStream currentZipOutputStream = null;
    private  File currentZipFile = null;
    private  long totalBytesWritten = 0;
    private  int currentZipCount = 0;
    private  String basePath = ""; // 基本路径,用于在ZIP中保持相对路径

    private String outZipName = "";//输出压缩包的名称

    public void addFileToZip(File fileToAdd, String parentPath) throws IOException {
        long approximateFileSize = getApproximateFileSize(fileToAdd);//计算要压缩的文件(文件夹)大小
        if (currentZipOutputStream == null || (totalBytesWritten + approximateFileSize > MAX_ZIP_SIZE && totalBytesWritten != 0)) {
            closeCurrentZip();
            openNewZip();
        }

        if (fileToAdd.isDirectory()) {
            File[] files = fileToAdd.listFiles();
            if (files != null) {
                for (File file : files) {
                    addFileToZip(file, parentPath + fileToAdd.getName() + "/");
                }
            }
        } else {
            ZipEntry zipEntry = new ZipEntry(parentPath + fileToAdd.getName());
            currentZipOutputStream.putNextEntry(zipEntry);

            FileInputStream fis = new FileInputStream(fileToAdd);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) >= 0) {
                currentZipOutputStream.write(buffer, 0, length);
                totalBytesWritten += length; // 更新已写入的总字节数
            }
            fis.close();
            currentZipOutputStream.closeEntry();
        }
    }

    private long getApproximateFileSize(File file) {
        if (file.isDirectory()) {
            long length = 0;
            File[] files = file.listFiles();
            if (files != null) {
                for (File childFile : files) {
                    length += getApproximateFileSize(childFile);
                }
            }
            return length;
        } else {
            return file.length();
        }
    }

    private void openNewZip() throws IOException {
        totalBytesWritten = 0; // 重置已写入的字节数
        currentZipCount++;
        currentZipFile = new File(outZipName + "_" + currentZipCount + ".zip");
        currentZipOutputStream = new ZipOutputStream(new FileOutputStream(currentZipFile));
    }

    private void closeCurrentZip() throws IOException {
        if (currentZipOutputStream != null) {
            currentZipOutputStream.close();
            currentZipOutputStream = null;
        }
    }

    public void zipDirectory(File directoryToZip, String baseDirectoryPath) throws IOException {
        basePath = baseDirectoryPath;
        if (directoryToZip.isDirectory()) {
            addFileToZip(directoryToZip, "");
        } else {
            throw new IOException("The specified path is not a directory.");
        }
        closeCurrentZip(); // 确保关闭最后一个ZIP文件  
    }

    /**
     *
     * @param folder 要压缩的文件夹
     * @param targetZipName 生成压缩包的名称
     */
    public void start(String folder,String targetZipName) throws Exception {
        if (isBlank(folder) || isBlank(targetZipName)) {
            throw new Exception("不能压缩。。。。。。");
        }
        outZipName = targetZipName;
        File dirToZip = new File(folder); // 替换为你要压缩的目录路径
        String baseDirPath = dirToZip.getName(); // 通常我们想要基于目录名来创建ZIP文件的根目录
        try {
            zipDirectory(dirToZip, baseDirPath + "/");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        SplitZip splitZip = new SplitZip();
        splitZip.start("D:\\新建文件夹","D:\\新建文件夹");
 } }

 




标签:分卷压缩,java,String,private,length,文件夹,File,new,currentZipOutputStream
From: https://www.cnblogs.com/huangruiwu/p/18112841

相关文章

  • Java开发工具:IDEA
    学习,开发编程都离不开开发工具,常见之一的开发工具IDEA:一般学习使用的话使用免费的社区版本就够用了;https://www.jetbrains.com.cn/idea/download/download-thanks.html?platform=windows&code=IIC下载下来傻瓜式点点点安装就好了,使用开发工具让让我们在学习和开发的时候更好,......
  • C#-JavaScript-base64加密解码
    C#//base64加密//调用方式:Helper.EncodeToBase64(需要加密字符串)publicstaticstringEncodeToBase64(stringdata){byte[]byteData=Encoding.UTF8.GetBytes(data);returnConvert.ToBase64String(byteData);......
  • Java基础核心Map
    在Java中,Map是一种用于存储键值对(key-valuepairs)的集合类型。它提供了一种将键映射到值的方式,其中每个键在Map中都是唯一的。Map接口是java.util包中的一部分。常用实现类:HashMap:基于哈希表实现的Map,它提供了平均时间复杂度为O(1)的插入、删除和查找操作。但它不保证元......
  • Java集合框架详解:List、Set、Map及其实现类的使用与特性 第一章
    目录一、引言定义:重要性:文章目的:二、Java集合框架概述集合框架结构:常用接口概览:集合框架通用特性:一、引言Java集合框架是Java语言提供的一套统一、灵活且高效的API,用于存储、操作和管理对象集合的数据结构。它作为Java标准库的核心组成部分,对于任何Java开发者而......
  • Java集合框架详解:List、Set、Map及其实现类的使用与特性 第二章
    目录一、List接口及其常见实现类List接口定义与特性:ArrayList:Vector与Stack:二、Set接口及其常见实现类Set接口定义与特性:HashSet:TreeSet:LinkedHashSet:一、List接口及其常见实现类List接口定义与特性:List接口是Java集合框架中一个重要的接口,继承自Collection接口......
  • Java集合框架详解:List、Set、Map及其实现类的使用与特性 第三章
    目录一、JavaMap接口及其常见实现类Map接口定义与特性HashMapTreeMapLinkedHashMapHashtable与ConcurrentHashMap一、JavaMap接口及其常见实现类Map接口定义与特性Map接口是Java集合框架中的一个重要接口,它提供了一种键值对(Key-ValuePair)的存储结构。Map的主要......
  • Java集合框架详解:List、Set、Map及其实现类的使用与特性 第四章
    目录一、Java集合框架的选择与优化选择策略性能优化二、结论一、Java集合框架的选择与优化选择策略根据数据特性和应用需求,选择合适的Java集合类型应考虑以下几个关键因素:是否允许重复:不允许重复:如果元素必须唯一,应选择Set接口的实现类,如HashSet(无序,查找速度快)或T......
  • 走向Java的第一步,Hello,World
    此笔记仅针对自己在学习路上所学所遇的问题!!!不管任何语言,敲的第一个代码毋庸置疑就是helloworld,Java的helloworld如下:点击查看代码publicclassHello{ publicstatic void main(String[]args){ System.out.print("Hello,World!!"); }}此处注意点:Java书写需严格规......
  • 用JavaScript实现响应式设计的魔法
    在数字世界的迷宫中,响应式设计就像是一把万能钥匙,能打开任何大小屏幕的大门。不论是巨大的桌面显示器,还是袖珍的手机屏幕,响应式设计确保你的网站或应用能在任何设备上都提供优质的用户体验。但如何用JavaScript施展这种魔法呢?让我们一探究竟。使用媒体查询监听器在CSS中,我......
  • 使用JavaScript提升Web应用的安全性
    在构建Web应用时,安全性是一个我们绝不能忽视的重要方面。随着网络攻击手段的日益狡猾和复杂,如何保护我们的应用和用户的数据安全成了每个开发者必须面对的问题。本文将介绍一些常见的Web安全威胁,比如跨站脚本攻击(XSS)、跨站请求伪造(CSRF),以及如何通过使用ContentSecurityPol......