猿问

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

我正在尝试使用从 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) );


暮色呼如
浏览 310回答 1
1回答

喵喔喔

我的猜测是 getInputStream() 返回一个流到压缩的 xml 文件,这将是不可读的。如果您正在阅读已被 ZIP 压缩的条目,则不应发生这种情况。ZipFile 类将负责解压缩。如果压缩是在将条目添加到 ZIP 文件之前通过其他方式完成的,那么将ZipFile不会意识到它已被压缩。您将需要:弄清楚使用了什么压缩方案。在尝试解析流之前自行解压缩流。getInputStream()例如,用 a或类似的方式包装结果DeflaterInputStream。第三种可能性是流不是格式正确的 XML……或者根本不是 XML。建议:使用 ZIP 工具将有问题的 ZIP 条目提取到文件系统中的本地文件,然后使用 UNIX / Linux 命令之类的实用程序找出file真正的文件类型。(不要相信文件后缀。它可能会误导您。)
随时随地看视频慕课网APP

相关分类

Java
我要回答