如何从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("========================="); } } }
额外说明
- 我添加了
try-with-resources语法,它会自动关闭ZipInputStream,比手动调用close()更安全,避免资源泄漏 - 加入了XML文件过滤逻辑(
endsWith(".xml")),如果你需要处理所有文件,去掉这个判断即可 - 读取字符串时指定了
UTF-8编码,能有效避免不同系统下的乱码问题 - 最后通过遍历
Map可以清晰看到每个文件的独立内容,后续你也可以根据文件名直接从Map中获取对应内容
内容的提问来源于stack exchange,提问作者Amara
相关产品推荐
相关产品推荐

