如何在不写入磁盘的情况下解析 zip 中的文件 - java

问题描述

我有一个密码保护的 zip 文件 [采用 base64 编码数据和 zip 文件名称的形式],其中包含一个 xml。我希望在不向磁盘写入任何内容的情况下解析该 xml。在 Zip4j 中这样做的方法是什么?以下是我尝试过的。

<div class="ng-input">
        <input role="comboBox" type="text" autocomplete="a3953165bdb9" id="" aria-expanded="true" aria-owns="a3953165bdb9" aria-activedescendant="a1e991b1869a">
</div>

这让我在第 String docTitle = request.getDocTitle(); byte[] decodedFileData = Base64.getDecoder().decode(request.getBase64Data()); InputStream inputStream = new ByteArrayInputStream(decodedFileData); try (ZipInputStream zipInputStream = new ZipInputStream(inputStream,password)) { while ((localFileHeader = zipInputStream.getNextEntry()) != null) { String fileTitle = localFileHeader.getFileName(); File extractedFile = new File(fileTitle); try (InputStream individualFileInputStream = org.apache.commons.io.FileUtils.openInputStream(extractedFile)) { // Call parser parser.parse(localFileHeader.getFileName(),individualFileInputStream)); } catch (IOException e) { // Handle IOException } } } catch (IOException e) { // Handle IOException } 行出现 java.io.FileNotFoundException: File 'xyz.xml' does not exist。你能建议我正确的方法吗?

解决方法

ZipInputStream 保留 zip 文件的所有内容。 zipInputStream.getNextEntry() 的每次调用都会传递每个文件的内容并将“指针”移动到下一个条目(文件)。您还可以在移至下一个条目之前阅读文件 (ZipInputStream.read)。

您的情况:

        byte[] decodedFileData = Base64.getDecoder().decode(request.getBase64Data());
        InputStream inputStream = new ByteArrayInputStream(decodedFileData);
        try (ZipInputStream zipInputStream = new ZipInputStream(inputStream,password)) {
            ZipEntry zipEntry = null;
            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
                byte[] fileContent = IOUtils.toByteArray(zipInputStream);
                parser.parse(zipEntry.getName(),new ByteArrayInputStream(fileContent)));      
            }
        } catch (Exception e) {
            // Handle Exception
        }