You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从ZIP文件中分别读取不同XML文件的内容

解决ZIP包中多XML文件内容分别存储的问题

我来帮你搞定这个问题!你的核心需求是把ZIP里每个XML文件的内容单独存储,而不是全部拼在一起,咱们可以通过以下几个关键修改来实现:

关键修改点

  • 把原来的单个StringBuilder换成映射容器(比如Map<String, String>),用来关联每个XML文件的文件名和对应的内容
  • 每次处理一个新的ZipEntry时,创建专属的StringBuilder来存储当前文件的内容,避免和其他文件内容混淆
  • 移除原代码中多余的第二个while循环(它完全没必要,第一个循环已经遍历完所有ZIP条目了)
  • 处理完每个文件后,把文件名和内容存入映射容器,方便后续按需获取

修改后的完整代码

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnzipFile {
    public static void main(String[] args) throws IOException {
        String zipFileName = "people.zip";
        // 用Map存储每个文件的文件名和对应的内容
        Map<String, String> fileContents = new HashMap<>();
        byte[] buffer = new byte[1024];
        
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFileName))) {
            ZipEntry zipEntry;
            int read;
            
            while ((zipEntry = zis.getNextEntry()) != null) {
                // 只处理XML文件(可选,如果你只想过滤XML的话)
                if (zipEntry.getName().endsWith(".xml")) {
                    StringBuilder currentFileContent = new StringBuilder();
                    // 读取当前文件的所有内容
                    while ((read = zis.read(buffer, 0, 1024)) >= 0) {
                        // 建议指定编码,比如UTF-8,避免乱码
                        currentFileContent.append(new String(buffer, 0, read, "UTF-8"));
                    }
                    // 将当前文件的名称和内容存入Map
                    fileContents.put(zipEntry.getName(), currentFileContent.toString());
                }
                // 关闭当前条目
                zis.closeEntry();
            }
        }
        
        // 验证结果:遍历Map输出每个文件的内容
        System.out.println("Unzip complete");
        for (Map.Entry<String, String> entry : fileContents.entrySet()) {
            System.out.println("=== 文件:" + entry.getKey() + " 内容 ===");
            System.out.println(entry.getValue());
            System.out.println("=========================");
        }
    }
}

额外说明

  1. 我添加了try-with-resources语法,它会自动关闭ZipInputStream,比手动调用close()更安全,避免资源泄漏
  2. 加入了XML文件过滤逻辑(endsWith(".xml")),如果你需要处理所有文件,去掉这个判断即可
  3. 读取字符串时指定了UTF-8编码,能有效避免不同系统下的乱码问题
  4. 最后通过遍历Map可以清晰看到每个文件的独立内容,后续你也可以根据文件名直接从Map中获取对应内容

内容的提问来源于stack exchange,提问作者Amara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:13:10