Java压缩与解压缩ZIP文件

前言

在现代计算机上,数据传输和存储越来越依赖于文件压缩技术。当我们需要发送大量数据时,压缩文件可以大大减少传输时间和网络带宽,而且压缩文件还可以帮助我们节省磁盘空间。在Java中提供了压缩和解压缩文件的功能,可以使用java.util.zip包中的类来实现。本篇将对如何使用 Java 实现单文多件压缩和解压缩进行总结。

文件压缩指的是将一个或多个文件通过压缩算法,将其存储为一个更小的文件,以便于存储和传输。压缩的原理是通过对文件的数据进行编码和压缩,使其占用更少的空间。压缩后的文件可以通过解压缩算法还原成原始的文件格式。在文件压缩过程中,常见的操作是将多个文件打包成一个压缩文件,例如zip、tar等格式。

Java解压缩文件

常见的文件压缩格式包括:

  • ZIP:最常见的压缩文件格式之一,可以存储一个或多个文件,并可在不同的操作系统中进行解压缩。
  • TAR:Linux系统中的常见文件压缩格式,通常用于打包多个文件,但不会进行压缩。
  • GZIP:常用的文件压缩格式,通常用于压缩单个文件,可以获得更高的压缩比。
  • BZIP2:高效的压缩算法,通常用于压缩文本文件和XML文件等。
  • JAR: Jar包对于Java开发同学来说肯定很熟悉,其也是一个压缩包

Java提供了多种用于压缩和解压缩文件的API,主要包括以下类和方法:

  • ZipOutputStream 和 ZipInputStream:用于创建和读取ZIP格式的压缩文件。
  • GZIPOutputStream 和 GZIPInputStream:用于创建和读取GZIP格式的压缩文件。
  • JarOutputStream 和 JarInputStream:用于创建和读取JAR格式的压缩文件。
  • DeflaterOutputStream 和 InflaterInputStream:用于创建和读取DEFLATE格式的压缩文件。
  • CheckedOutputStream 和 CheckedInputStream:用于在压缩和解压缩过程中计算文件的校验和。

压缩和解压缩ZIP文件

通过使用Java 自带的 java.util.zip 类库下的ZipOutputStreamZipInputStreamZipEntry实现文件的压缩和解压缩,其中ZipOutputStream用于创建ZIP压缩文件输出流输出ZIP压缩文件,ZipInputStream用于创建ZIP文件输入流读取ZIP文件用于解压缩而ZipEntry对应ZIP压缩包中的每个被压缩对象;

  • 生成ZIP文件

    压缩单个文件或者单个文件夹方法,代码如下:

    /**
     * 压缩文件(支持单个文件和单个文件夹)
     * @param sourceFile 被压缩文件/文件夹
     * @param zipFile Zip文件
     */
    public static void zipCompress(File sourceFile, File zipFile) {
         
         
        try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) {
         
         
            // 设置压缩方法
            zos.setMethod(ZipOutputStream.DEFLATED);
            zos.setLevel(Deflater.BEST_COMPRESSION); // 默认为-1,压缩级别,1速度快,效率低,9 速度满,效率高
            // zos.setLevel(Deflater.BEST_SPEED);
            zos.setComment("zip文件说明");
            // 处理文件夹
            if (sourceFile.exists() && sourceFile.isDirectory() && Objects.nonNull(sourceFile.listFiles())){
         
         
                Arrays.stream(Objects.requireNonNull(sourceFile.listFiles())).forEach(file -> {
         
         
                    addZipFile(file, zos);
                });
            }else{
         
         
                addZipFile(sourceFile, zos);
            }
        } catch (IOException e) {
         
         
            e.printStackTrace();
        }
    }
    

    为了支持读取单个文件夹进行压缩,增加一个向ZipOutputStream中添加ZipEntry的方法,代码如下:

    /**
     * 向ZIP中添加文件
     * @param file 源文件
     * @param zos zip输出流
     */
    private static void addZipFile(File file, ZipOutputStream zos){
         
         
        if (!file.exists() || file.isDirectory()){
         
         
            throw new RuntimeException("文件不存在或该文件为文件夹,请检查");
        }
        try {
         
         
            // 读入文件
            FileInputStream fis = new FileInputStream(file);
            // 创建压缩对象并设置一些属性
            ZipEntry entry = new ZipEntry(file.getName());
            entry.setMethod(ZipEntry.DEFLATED); // 压缩方法默认为DEFLATED
            // entry.setMethod(ZipEntry.STORED); // STORED(不压缩)。当使用STORED压缩方法时,需要设置未压缩的数据大小和CRC-32校验和,否则压缩和解压缩时会出现错误。
            entry.setSize(file.length()); // 设置未压缩的数据大小,这里设置的是文件大小
            // 计算 CRC-32 校验码
            // byte[] data = Files.readAllBytes(file.toPath());
            // CRC32 crc = new CRC32();
            // crc.update(data);
            // entry.setCrc(crc.getValue()); // 设置CRC-32校验和,用于保证压缩后的数据完整性,尽量别手动设置,可以通过CRC-32计算
            entry.setCompressedSize(file
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵@香菜

感谢观众老爷送的一发火箭!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值