为了账号安全,请及时绑定邮箱和手机立即绑定

使用 ZipEntry.getInputStream(entry) 获得的流异常

使用 ZipEntry.getInputStream(entry) 获得的流异常

暮色呼如 2023-03-02 16:11:38
我正在尝试使用从 zip 文件中读取一些 xml 文件java.util.zip.ZipFile,我希望获得一个输入流,然后我可以使用 sax 解析器对其进行解析,但由于序言错误而不断出现 Sax 异常。这意味着我没有从 inputStream 中得到我期望的结果。我错过了什么?if (path.endsWith(".zip")){            ZipFile file = new ZipFile(path);            Enumeration<? extends ZipEntry> entries = file.entries();            while (entries.hasMoreElements()){                methodThatHandlesXmlInputStream(file.getInputStream(entries.nextElement()));            }        }void methodThatHandlesXmlInputStream(InputStream input){     doSomethingToTheInput(input);     tryToParseXMLFromInput(input); //This is where the exception was thrown}重访解决方案: 问题是处理它的方法消耗了InputStream它并试图再次读取它。我了解到最好InputStream从 zip 文件生成单独的 s 并分别处理每个文件。 ZipFile zipFile = new ZipFile(path); Enumeration<? extends ZipEntry> entries = file.entries();    while (entries.hasMoreElements()){        ZipEntry entry = entries.nextElement();        methodConsumingInput( zipFile.getInputStream(entry) );        anotherMethodConsumingSameInput( zipFile.getInputStream(entry) );
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

我的猜测是 getInputStream() 返回一个流到压缩的 xml 文件,这将是不可读的。

如果您正在阅读已被 ZIP 压缩的条目,则不应发生这种情况。ZipFile 类将负责解压缩。

如果压缩是在将条目添加到 ZIP 文件之前通过其他方式完成的,那么将ZipFile不会意识到它已被压缩。您将需要:

  1. 弄清楚使用了什么压缩方案。

  2. 在尝试解析流之前自行解压缩流。getInputStream()例如,用 a或类似的方式包装结果DeflaterInputStream

第三种可能性是流不是格式正确的 XML……或者根本不是 XML。


建议:使用 ZIP 工具将有问题的 ZIP 条目提取到文件系统中的本地文件,然后使用 UNIX / Linux 命令之类的实用程序找出file真正的文件类型。(不要相信文件后缀。它可能会误导您。)


查看完整回答
反对 回复 2023-03-02
  • 1 回答
  • 0 关注
  • 308 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信