Java 将文件,文件夹打入压缩包zip,rar

Posted GW_Cheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 将文件,文件夹打入压缩包zip,rar相关的知识,希望对你有一定的参考价值。

批量下载经常会有将文件打包下载的需求,比如批量下载图片

今天就分享一个java将文件夹中的所有文件(包括文件夹,递归)打包成压缩包(支持rar和zip)

先看效果,测试目录

李四文件夹下有文件夹和,文件和一个空文件夹(空文件夹打包到压缩包显示图标和类型都有点问题,这个还没找的解决方案,可以不打进去

压缩包截图(打包空目录)

不打包空目录(rar)

依赖

		<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtil 

    public static void main(String[] args) throws Exception 
        String dir = "E:\\\\zip";
        String zip = "E:\\\\target.zip";
        String rar = "E:\\\\target.rar";
        zip(dir, zip);
        zip(dir, rar, true);
    


    /**
     * 打包
     *
     * @param dir     要打包的目录
     * @param zipFile 打包后的文件路径
     * @throws Exception
     */
    public static void zip(String dir, String zipFile) throws Exception 
        zip(dir, zipFile, false);
    

    /**
     * 打包
     *
     * @param dir            要打包的目录
     * @param zipFile        打包后的文件路径
     * @param includeBaseDir 是否包括最外层目录
     * @throws Exception
     */
    public static void zip(String dir, String zipFile, boolean includeBaseDir) throws Exception 
        if (zipFile.startsWith(dir)) 
            throw new RuntimeException("打包生成的文件不能在打包目录中");
        
        try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))) 
            File fileDir = new File(dir);
            String baseDir = "";
            if (includeBaseDir) 
                baseDir = fileDir.getName();
            
            compress(out, fileDir, baseDir);
        
    

    public static void compress(ZipOutputStream out, File sourceFile, String base) throws Exception 

        if (sourceFile.isDirectory()) 
            base = base.length() == 0 ? "" : base + File.separator;
            File[] files = sourceFile.listFiles();
            if (ArrayUtils.isEmpty(files)) 
                // todo 打包空目录
                // out.putNextEntry(new ZipEntry(base));
                return;
            
            for (File file : files) 
                compress(out, file, base + file.getName());
            
         else  
            out.putNextEntry(new ZipEntry(base));
            try (FileInputStream in = new FileInputStream(sourceFile)) 
                IOUtils.copy(in, out);
             catch (Exception e) 
                throw new RuntimeException("打包异常: " + e.getMessage());
            
        
    

参考文献

https://www.cnblogs.com/tobiasy/p/8258419.html

以上是关于Java 将文件,文件夹打入压缩包zip,rar的主要内容,如果未能解决你的问题,请参考以下文章

Java能否对压缩文件进行操作,例如:对zip,rar,tar等文件进行复制。

java上传图片到数据库,涉及压缩文件zip/rar上传等

怎么把压缩文件rar格式转化成csv格式?

Java上传pdf文件,只压缩大小,不改变成.zip/.rar文件

java关于压缩包的处理,我这里贴出三中格式的(zip,rar,tar)解压方法(目前只用到解压,所以压缩过多研究)。

java代码实现 导出zip包,无法打开zip压缩包