Hutool Hutool
(opens new window)
🏡首页
📖指南
🎢最佳实践
💖支持
💡javaDoc (opens new window)
⏳更新记录 (opens new window)
  • 🍎gitee (opens new window)
  • 🍏github (opens new window)
(opens new window)
🏡首页
📖指南
🎢最佳实践
💖支持
💡javaDoc (opens new window)
⏳更新记录 (opens new window)
  • 🍎gitee (opens new window)
  • 🍏github (opens new window)
  • 快速入门

  • 核心(hutool-core)

    • AI(Hutool-ai)

    • 注解(annotation)

    • 数组(array)

    • JavaBean(bean)

    • 缓存(cache)

    • 类加载器(classloader)

    • 编码解码(codec)

    • 集合(collection)

    • 比较器(comparator)

    • 压缩(compress)

      • 简介
      • ZIP工具-ZipUtil
      • GZIP工具-Gzip
      • DEFLATE工具-Deflate
      • ZIP读取器-ZipReader
      • ZIP写入器-ZipWriter
      • ZIP替换工具-ZipReplacer
        • 📚简介
        • 🏗️核心结构
          • 1. 类定义
          • 2. 核心属性
        • 🔧 API说明
          • 1. 构造方法
          • ZipReplacer(ZipReader zipReader, boolean ignoreCase)
          • 2. 添加替换内容
          • addReplace(String entryPath, Resource resource)
          • 3. 写出新的Zip文件
          • write(ZipWriter writer)
          • 4. 资源关闭
          • close()
        • 🚀 使用示例
          • 1. 替换Zip文件中的单个文件
          • 2. 替换多个文件
          • 3. 使用流资源替换
          • 4. 结合其他工具类使用
        • 🎯 设计优势
          • 1. 高效的替换方式
          • 2. 灵活的匹配方式
          • 3. 链式调用设计
          • 4. 与其他压缩工具无缝集成
          • 5. 自动资源管理
          • 6. 安全的设计
        • 📌 注意事项
          • 1. 路径匹配
          • 2. 资源管理
          • 3. 大文件处理
          • 4. 编码问题
          • 5. 替换逻辑
        • 🔄 与传统方式的对比
          • 1. 传统方式(复杂)
          • 2. Hutool方式(简洁)
        • 📚 相关文档
      • ZIP资源-ZipResource
      • ZIP64支持-Zip64
    • 类型转换(convert)

    • 数据(data)

    • 日期时间(date)

    • 异常(exception)

    • 函数(func)

    • IO流(io)

    • 语言特性(lang)

    • Map(map)

    • 数字数学(math)

    • 网络(net)

    • 对象池(pool)

    • 反射(reflect)

    • 正则(regex)

    • 服务提供(spi)

    • 聚合操作(stream)

    • 字符串文本(text)

    • 并发和线程(thread)

    • 树结构(tree)

    • 工具集合(util)

    • XML操作(xml)

  • 定时任务(hutool-cron)

  • 加密(hutool-crypto)

  • 数据库(hutool-db)

  • 扩展(hutool-extra)

  • HTTP(hutool-http)

  • 日志(hutool-log)

  • 配置文件(hutool-setting)

  • JSON(hutool-json)

  • Office办公(hutool-poi)

  • 套接字(hutool-socket)

  • GUI(hutool-swing)

  • 指南
  • 核心(hutool-core)
  • 压缩(compress)
Hutool
2026-01-15
目录

ZIP替换工具-ZipReplacer

# 📚简介

ZipReplacer类是Hutool压缩模块中用于替换Zip文件内容的工具类,它可以读取源Zip文件,替换其中指定路径的内容,并生成新的Zip文件。通过ZipReplacer,开发者可以轻松地修改Zip文件中的特定文件,而无需解压整个Zip文件,再重新压缩。

# 🏗️核心结构

# 1. 类定义

public class ZipReplacer implements Closeable {
    private final ZipReader zipReader;
    private final boolean ignoreCase;
    private final Map<String, Resource> replacedResources = new HashMap<>();
    // ...
}

# 2. 核心属性

属性名 类型 描述
zipReader ZipReader 用于读取源Zip文件的ZipReader实例
ignoreCase boolean 是否忽略路径大小写,用于匹配要替换的文件
replacedResources Map<String, Resource> 存储要替换的资源映射,key为Zip中的路径,value为新的资源

# 🔧 API说明

# 1. 构造方法

# ZipReplacer(ZipReader zipReader, boolean ignoreCase)

创建ZipReplacer实例。

参数说明:

  • zipReader:用于读取源Zip文件的ZipReader实例
  • ignoreCase:是否忽略路径大小写,true表示忽略大小写匹配

# 2. 添加替换内容

# addReplace(String entryPath, Resource resource)

增加要替换的内容,如果路径不匹配,则不做替换,也不加入。

参数说明:

  • entryPath:要替换的文件在Zip中的路径
  • resource:替换后的资源内容

返回值:

  • ZipReplacer实例,用于链式调用

# 3. 写出新的Zip文件

# write(ZipWriter writer)

将替换后的内容写出到指定的ZipWriter。

参数说明:

  • writer:用于写出新Zip文件的ZipWriter实例

实现逻辑:

  1. 遍历源Zip文件中的所有条目
  2. 对于每个条目,检查是否需要替换
  3. 如果需要替换,使用新的资源内容
  4. 如果不需要替换,使用源文件内容
  5. 将所有条目写入到新的Zip文件中

# 4. 资源关闭

# close()

关闭ZipReplacer,释放资源。

实现逻辑:

  • 关闭内部的ZipReader实例

# 🚀 使用示例

# 1. 替换Zip文件中的单个文件

// 源Zip文件和目标Zip文件
File sourceZip = FileUtil.file("source.zip");
File targetZip = FileUtil.file("target.zip");

// 创建ZipReader和ZipWriter
try (ZipReader reader = ZipReader.of(sourceZip, CharsetUtil.CHARSET_UTF_8);
     ZipWriter writer = ZipWriter.of(targetZip, CharsetUtil.CHARSET_UTF_8);
     // 创建ZipReplacer,忽略路径大小写
     ZipReplacer replacer = new ZipReplacer(reader, true)) {

    // 添加要替换的文件
    replacer.addReplace("config.txt", new FileResource("new_config.txt"));

    // 写出新的Zip文件
    replacer.write(writer);

    Console.log("Zip文件替换完成!源文件:{}, 目标文件:{}",
              sourceZip.getAbsolutePath(), targetZip.getAbsolutePath());
}

# 2. 替换多个文件

// 替换多个文件
try (ZipReader reader = ZipReader.of(FileUtil.file("source.zip"), CharsetUtil.CHARSET_UTF_8);
     ZipWriter writer = ZipWriter.of(FileUtil.file("target.zip"), CharsetUtil.CHARSET_UTF_8);
     ZipReplacer replacer = new ZipReplacer(reader, false)) {

    // 批量添加要替换的文件
    replacer.addReplace("file1.txt", new FileResource("new_file1.txt"))
            .addReplace("file2.txt", new FileResource("new_file2.txt"))
            .addReplace("dir/config.txt", new FileResource("new_config.txt"));

    replacer.write(writer);
    Console.log("多个文件替换完成!");
}

# 3. 使用流资源替换

// 使用流资源替换文件内容
try (ZipReader reader = ZipReader.of(FileUtil.file("source.zip"), CharsetUtil.CHARSET_UTF_8);
     ZipWriter writer = ZipWriter.of(FileUtil.file("target.zip"), CharsetUtil.CHARSET_UTF_8);
     ZipReplacer replacer = new ZipReplacer(reader, true)) {

    // 创建流资源
    String newContent = "这是替换后的内容\n";
    StreamResource resource = new StreamResource(
        () -> new ByteArrayInputStream(newContent.getBytes(CharsetUtil.CHARSET_UTF_8)),
        "content.txt"
    );

    replacer.addReplace("content.txt", resource);
    replacer.write(writer);

    Console.log("使用流资源替换完成!");
}

# 4. 结合其他工具类使用

// 结合其他Hutool工具类使用
try (ZipReader reader = ZipReader.of(FileUtil.file("source.zip"), CharsetUtil.CHARSET_UTF_8);
     ZipWriter writer = ZipWriter.of(FileUtil.file("target.zip"), CharsetUtil.CHARSET_UTF_8);
     ZipReplacer replacer = new ZipReplacer(reader, false)) {

    // 替换文件,并设置新的压缩级别
    writer.setLevel(9);
    writer.setComment("替换后的Zip文件");

    replacer.addReplace("data.json", new FileResource("updated_data.json"));
    replacer.write(writer);

    Console.log("结合其他工具类使用完成!");
}

# 🎯 设计优势

# 1. 高效的替换方式

  • 无需解压整个Zip文件,直接在流中进行替换
  • 只处理需要替换的文件,减少IO开销
  • 避免了临时文件的创建,节省磁盘空间

# 2. 灵活的匹配方式

  • 支持大小写敏感和不敏感两种匹配模式
  • 可以精确匹配文件路径
  • 支持替换多个文件

# 3. 链式调用设计

  • 提供流畅的链式调用API
  • 代码结构清晰,易于阅读和维护
  • 支持批量添加替换内容

# 4. 与其他压缩工具无缝集成

  • 与ZipReader和ZipWriter完美配合
  • 可以利用ZipWriter的各种配置选项
  • 支持自定义压缩级别、注释等

# 5. 自动资源管理

  • 实现了Closeable接口,可以配合try-with-resources使用
  • 自动关闭内部的ZipReader资源
  • 避免资源泄漏

# 6. 安全的设计

  • 内部使用Map存储替换内容,确保每个路径只被替换一次
  • 路径匹配逻辑经过优化,确保正确匹配
  • 自动处理各种边界情况

# 📌 注意事项

# 1. 路径匹配

  • 确保替换路径与Zip文件中的实际路径一致
  • 根据实际情况选择是否忽略大小写
  • 路径分隔符使用斜杠(/),Hutool会自动处理不同操作系统的差异

# 2. 资源管理

  • 确保正确关闭所有资源,特别是ZipReader和ZipWriter
  • 建议使用try-with-resources语句自动管理资源
  • 替换的资源会在写入完成后自动关闭

# 3. 大文件处理

  • 对于超大Zip文件,建议使用默认配置
  • 可以适当调整ZipWriter的缓存大小以优化性能
  • 避免一次性替换大量文件,可能导致内存占用过高

# 4. 编码问题

  • 确保ZipReader和ZipWriter使用相同的编码
  • 特别是处理非UTF-8编码的Zip文件时
  • 建议显式指定编码,避免默认编码导致的问题

# 5. 替换逻辑

  • 替换操作是基于路径匹配的,如果路径不匹配则不会替换
  • 可以替换不存在的文件,这会在新的Zip文件中添加该文件
  • 替换顺序不影响最终结果,每个路径只会被替换一次

# 🔄 与传统方式的对比

# 1. 传统方式(复杂)

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

// 传统方式替换Zip文件中的内容
String sourceZipPath = "source.zip";
String targetZipPath = "target.zip";
String fileToReplace = "config.txt";
String newFilePath = "new_config.txt";

try (ZipInputStream zis = new ZipInputStream(
         new FileInputStream(sourceZipPath), StandardCharsets.UTF_8);
     ZipOutputStream zos = new ZipOutputStream(
         new FileOutputStream(targetZipPath), StandardCharsets.UTF_8)) {

    ZipEntry entry;
    while ((entry = zis.getNextEntry()) != null) {
        String entryName = entry.getName();
        ZipEntry newEntry = new ZipEntry(entryName);
        zos.putNextEntry(newEntry);

        if (entryName.equals(fileToReplace)) {
            // 替换文件内容
            try (FileInputStream fis = new FileInputStream(newFilePath)) {
                byte[] buffer = new byte[1024];
                int len;
                while ((len = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, len);
                }
            }
        } else {
            // 复制原文件内容
            byte[] buffer = new byte[1024];
            int len;
            while ((len = zis.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
        }

        zos.closeEntry();
    }

    zos.finish();
    Console.log("Zip文件替换完成!");
} catch (IOException e) {
    e.printStackTrace();
}

# 2. Hutool方式(简洁)

import cn.hutool.v7.core.compress.ZipReader;
import cn.hutool.v7.core.compress.ZipReplacer;
import cn.hutool.v7.core.compress.ZipWriter;
import cn.hutool.v7.core.io.FileUtil;
import cn.hutool.v7.core.io.resource.FileResource;
import cn.hutool.v7.core.util.CharsetUtil;
import cn.hutool.v7.core.util.Console;

// Hutool方式替换Zip文件中的内容
String sourceZipPath = "source.zip";
String targetZipPath = "target.zip";
String fileToReplace = "config.txt";
String newFilePath = "new_config.txt";

try (ZipReader reader = ZipReader.of(FileUtil.file(sourceZipPath), CharsetUtil.CHARSET_UTF_8);
     ZipWriter writer = ZipWriter.of(FileUtil.file(targetZipPath), CharsetUtil.CHARSET_UTF_8);
     ZipReplacer replacer = new ZipReplacer(reader, false)) {

    replacer.addReplace(fileToReplace
, new FileResource(newFilePath));
    replacer.write(writer);

    Console.log("Zip文件替换完成!");
}

# 📚 相关文档

  • 压缩模块简介
  • ZIP工具-ZipUtil
  • ZIP读取器-ZipReader
  • ZIP写入器-ZipWriter
ZIP写入器-ZipWriter
ZIP资源-ZipResource

← ZIP写入器-ZipWriter ZIP资源-ZipResource→

Theme by Vdoing | Copyright © 2025-2026 Hutool | Apache-2.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式