Java 压缩与解压工具类(ZipUtils / GzipUtils)

引言

在 Java 开发中,压缩和解压是常见的数据处理需求,尤其在文件传输、备份和存储优化等场景中。常用的压缩格式包括 ZIP 和 GZIP。为了简化压缩与解压操作,我们通常会封装一个工具类来处理这些任务。本文将详细介绍两个 Java 工具类 ZipUtilsGzipUtils,分别用于 ZIP 和 GZIP 格式的压缩与解压操作,提供完整的代码实现及其应用场景。

ZipUtils 工具类

ZipUtils 用于 ZIP 格式文件的压缩和解压,支持将多个文件和目录压缩为一个 ZIP 文件,并从 ZIP 文件中解压文件。

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipUtils {

    // 压缩文件或目录到 ZIP
    public static void zip(String sourcePath, String zipPath) throws IOException {
        try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipPath))) {
            File sourceFile = new File(sourcePath);
            compress(sourceFile, zos, sourceFile.getName());
        }
    }

    // 递归压缩文件或目录
    private static void compress(File file, ZipOutputStream zos, String entryName) throws IOException {
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files == null || files.length == 0) {
                zos.putNextEntry(new ZipEntry(entryName + "/"));
                zos.closeEntry();
            } else {
                for (File nestedFile : files) {
                    compress(nestedFile, zos, entryName + "/" + nestedFile.getName());
                }
            }
        } else {
            try (FileInputStream fis = new FileInputStream(file)) {
                zos.putNextEntry(new ZipEntry(entryName));
                byte[] buffer = new byte[1024];
                int len;
                while ((len = fis.read(buffer)) != -1) {
                    zos.write(buffer, 0, len);
                }
                zos.closeEntry();
            }
        }
    }

    // 解压 ZIP 文件到目标目录
    public static void unzip(String zipPath, String destDir) throws IOException {
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipPath))) {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                File outFile = new File(destDir, entry.getName());
                if (entry.isDirectory()) {
                    outFile.mkdirs();
                } else {
                    outFile.getParentFile().mkdirs();
                    try (FileOutputStream fos = new FileOutputStream(outFile)) {
                        byte[] buffer = new byte[1024];
                        int len;
                        while ((len = zis.read(buffer)) != -1) {
                            fos.write(buffer, 0, len);
                        }
                    }
                }
                zis.closeEntry();
            }
        }
    }
}
ZipUtils 方法详解
  1. 压缩文件或目录到 ZIP

    • zip(String sourcePath, String zipPath):将指定的文件或目录压缩为 ZIP 文件,支持递归压缩目录结构。
    • 使用 ZipOutputStream 逐层递归压缩文件和目录,并创建 ZIP 条目(ZipEntry)。
  2. 递归压缩文件或目录

    • compress(File file, ZipOutputStream zos, String entryName):递归方法,用于压缩目录结构和文件内容。
    • 创建对应的 ZIP 条目,对于目录还会递归压缩其子文件和子目录。
  3. 解压 ZIP 文件到目标目录

    • unzip(String zipPath, String destDir):将 ZIP 文件解压到指定的目标目录,保留目录结构。
    • 使用 ZipInputStream 读取 ZIP 条目并将其解压到目标位置,处理目录和文件的创建。
GzipUtils 工具类

GzipUtils 用于 GZIP 格式文件的压缩和解压,主要用于压缩单个文件。GZIP 不支持压缩多个文件或目录结构。

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

public class GzipUtils {

    // 压缩文件为 GZIP
    public static void gzip(String sourcePath, String gzipPath) throws IOException {
        try (FileInputStream fis = new FileInputStream(sourcePath);
             GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream(gzipPath))) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                gos.write(buffer, 0, len);
            }
        }
    }

    // 解压 GZIP 文件
    public static void gunzip(String gzipPath, String destPath) throws IOException {
        try (GZIPInputStream gis = new GZIPInputStream(new FileInputStream(gzipPath));
             FileOutputStream fos = new FileOutputStream(destPath)) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = gis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
        }
    }
}
GzipUtils 方法详解
  1. 压缩文件为 GZIP

    • gzip(String sourcePath, String gzipPath):将指定的文件压缩为 GZIP 格式,仅支持单个文件压缩。
    • 使用 GZIPOutputStream 对文件内容进行压缩,并写入到指定的 GZIP 文件。
  2. 解压 GZIP 文件

    • gunzip(String gzipPath, String destPath):将 GZIP 文件解压为原始文件内容,输出到指定路径。
    • 使用 GZIPInputStream 读取 GZIP 文件并将内容解压到目标文件。
应用场景
  1. 文件备份与存储优化

    • 通过压缩文件和目录,可以减少存储空间占用,适用于日志文件备份、配置文件打包等场景。
    • ZipUtils 提供的多文件和目录压缩能力特别适合这种场景。
  2. 数据传输优化

    • 使用压缩减少数据传输的体积,提高传输效率,特别是对于网络带宽受限的应用。
    • GzipUtils 常用于 HTTP 压缩响应、API 请求压缩等场景。
  3. 日志与报告归档

    • 将日志文件或生成的报告打包归档,便于存储和管理。
    • 可以使用 ZIP 压缩多个文件或使用 GZIP 压缩单个大文件。
使用示例
public class Main {
    public static void main(String[] args) {
        try {
            // 使用 ZipUtils 压缩目录
            String sourceDir = "path/to/directory";
            String zipFile = "path/to/output.zip";
            ZipUtils.zip(sourceDir, zipFile);
            System.out.println("Directory compressed to ZIP: " + zipFile);

            // 使用 ZipUtils 解压 ZIP 文件
            String destDir = "path/to/unzip";
            ZipUtils.unzip(zipFile, destDir);
            System.out.println("ZIP file uncompressed to: " + destDir);

            // 使用 GzipUtils 压缩文件
            String sourceFile = "path/to/file.txt";
            String gzipFile = "path/to/output.gz";
            GzipUtils.gzip(sourceFile, gzipFile);
            System.out.println("File compressed to GZIP: " + gzipFile);

            // 使用 GzipUtils 解压 GZIP 文件
            String destFile = "path/to/uncompressed.txt";
            GzipUtils.gunzip(gzipFile, destFile);
            System.out.println("GZIP file uncompressed to: " + destFile);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
优势与注意事项
  1. 优势

    • ZipUtilsGzipUtils 提供了对压缩和解压操作的封装,使代码更加简洁和易读。
    • 通过统一的接口方法,可以轻松进行文件和目录的压缩与解压,支持多种常用格式。
  2. 注意事项

    • 在使用压缩和解压时,需要注意文件路径的正确性和读写权限。
    • ZIP 和 GZIP 使用不同的压缩格式,不可互相替代,需要根据需求选择合适的工具类。
    • 解压过程中要防止目录穿越攻击,确保解压路径的安全性。
进阶与扩展
  1. 压缩级别控制:扩展工具类,支持设置压缩级别(如快速压缩或最大压缩)。
  2. 多线程压缩:对于大文件或多文件压缩,考虑使用多线程优化,提高压缩效率。
  3. 加密压缩:结合加密算法,对压缩文件进行加密保护,提高数据的安全性。
结论

ZipUtilsGzipUtils 是两个实用的 Java 工具类,通过

封装 ZIP 和 GZIP 格式的压缩与解压操作,简化了开发中的数据压缩任务。无论是用于文件备份、数据传输还是日志归档,这些工具类都提供了高效的解决方案。随着需求的变化,可以进一步扩展这些工具类,支持更多高级功能,为开发者提供更全面的压缩与解压解决方案。

总结
 ZipUtils:Java压缩和解压缩工具类

ZipUtils是一个Java工具类,用于压缩和解压缩文件或文件夹。它使用Java的ZipOutputStream和ZipInputStream类来执行这些操作。

压缩文件:
ZipUtils提供了一个compressFile方法,可以将文件压缩为一个ZIP文件。它接受两个参数:要压缩的文件和目标ZIP文件的路径。

压缩文件夹:
ZipUtils还提供了一个compressFolder方法,可以将整个文件夹压缩为一个ZIP文件。它接受两个参数:要压缩的文件夹的路径和目标ZIP文件的路径。

解压文件:
对于解压缩文件,ZipUtils提供了一个decompress方法,可以将ZIP文件解压缩到指定的目标文件夹。它接受两个参数:要解压缩的ZIP文件的路径和目标文件夹的路径。

GzipUtils:Java压缩和解压缩GZIP文件的工具类

GzipUtils是一个Java工具类,用于压缩和解压缩GZIP文件。它使用Java的GZIPOutputStream和GZIPInputStream类来执行这些操作。

压缩文件:
GzipUtils提供了一个compress方法,可以将文件压缩为一个GZIP文件。它接受两个参数:要压缩的文件和目标GZIP文件的路径。

解压文件:
对于解压缩GZIP文件,GzipUtils提供了一个decompress方法,可以将GZIP文件解压缩到指定的目标文件。它接受两个参数:要解压缩的GZIP文件的路径和目标文件的路径。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐