如何无需将Zip解压到目录即可直接读取其中的XML文件
实现思路
你当前代码已经用到了ZipInputStream,这个类本身就是边读取zip包边在内存解压条目内容的,你之前写文件到磁盘的FileOutputStream相关逻辑是唯一的落地操作,把这部分替换为直接读取流内容即可实现不落地读XML:
- 遍历
ZipEntry的时候先筛选后缀为.xml的目标文件,跳过不需要的目录和其他格式文件 - 针对匹配到的XML条目,直接从
ZipInputStream中读取字节内容,转成字符串或者按行读取即可,使用方式和你读本地磁盘XML的FileInputStream完全一致,不需要额外的XML解析器
修改后示例代码
import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ReadXmlFromZip { public static void main(String[] args) throws IOException { String zipFileName = "people.zip"; byte[] buffer = new byte[1024]; try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFileName))) { ZipEntry zipEntry = zis.getNextEntry(); while (zipEntry != null) { // 只处理非目录的xml文件 if (!zipEntry.isDirectory() && zipEntry.getName().endsWith(".xml")) { System.out.println("读取到XML文件:" + zipEntry.getName()); // 直接读流内容到内存,不用写文件 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len; while ((len = zis.read(buffer)) > 0) { baos.write(buffer, 0, len); } // 转成字符串,和你读普通XML文件拿到的内容完全一致 String xmlContent = baos.toString(StandardCharsets.UTF_8); // 这里就可以直接用xmlContent了,比如打印、按行处理都可以 System.out.println("XML内容:\n" + xmlContent); baos.close(); } zis.closeEntry(); zipEntry = zis.getNextEntry(); } } System.out.println("读取完成"); } }
需要学习的相关知识
- Java IO 流的通用操作逻辑:所有
InputStream子类(包括ZipInputStream、FileInputStream)的读取方式完全相同,只要拿到输入流就能用统一的逻辑读取内容,不用关心流的来源 ZipEntry的属性判断:可以通过文件名、文件大小等属性快速筛选你需要处理的文件,不需要处理zip包内所有条目- 编码处理:XML文件一般使用UTF-8编码,字节流转字符串时要明确指定编码,避免出现乱码问题
内容的提问来源于stack exchange,提问作者Amara
相关产品推荐
相关产品推荐

