Java如何读取zip压缩包内的XML文件并输出原始文本
问题解答
1. InputStreamReader能否读取XML文件
可以,XML本质是结构化文本文件,InputStreamReader作为字节流转字符流的桥梁,完全支持读取XML文本内容。
2. 当前代码的问题
你遇到的输出异常是代码逻辑错误直接导致的,核心问题如下:
- 最关键的错误:
readLine()方法被重复调用,while判断条件里已经读取了一行内容但没有保存,循环体里再次调用readLine()才打印,会直接丢弃所有奇数行内容,最终输出残缺甚至看起来全是空行。 - 空catch块吞掉了所有异常,就算出现编码错误、文件读取错误也不会输出报错信息,无法定位问题。
- 没有指定字符编码,InputStreamReader默认使用系统编码,如果XML的编码和系统编码不一致就会出现乱码。
- 没有主动关闭流资源,会造成JVM资源泄漏。
3. 修复后的可运行代码
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class TestDenemeZipExtract { public static void main(String[] args) { // try-with-resources语法会自动关闭资源,无需手动写close逻辑 try (ZipFile zipFile = new ZipFile("/home/user/Documents/file.zip", StandardCharsets.UTF_8)) { Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); // 跳过压缩包内的目录项 if (entry.isDirectory()) continue; if (entry.getName().endsWith(".xml")) { try (InputStream stream = zipFile.getInputStream(entry); BufferedReader bf = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { String line; // 单次调用readLine,保存到变量后再做判断和打印 while ((line = bf.readLine()) != null) { System.out.println(line); } } } } } catch (Exception e) { // 打印异常栈方便定位问题,不要吞异常 e.printStackTrace(); } } }
4. 适配说明
如果你的XML文件不是UTF-8编码,把代码里的StandardCharsets.UTF_8替换为对应编码即可,比如GBK编码可改为Charset.forName("GBK")。
内容的提问来源于stack exchange,提问作者amma velakin
相关产品推荐
相关产品推荐

