我正在尝试使用从 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
不会意识到它已被压缩。您将需要:
弄清楚使用了什么压缩方案。
在尝试解析流之前自行解压缩流。
getInputStream()
例如,用 a或类似的方式包装结果DeflaterInputStream
。
第三种可能性是流不是格式正确的 XML……或者根本不是 XML。
建议:使用 ZIP 工具将有问题的 ZIP 条目提取到文件系统中的本地文件,然后使用 UNIX / Linux 命令之类的实用程序找出file
真正的文件类型。(不要相信文件后缀。它可能会误导您。)
添加回答
举报
0/150
提交
取消