Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不写入磁盘的情况下解析zip中的文件-java_Java_Java Io_Zip4j - Fatal编程技术网

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

如何在不写入磁盘的情况下解析zip中的文件-java,java,java-io,zip4j,Java,Java Io,Zip4j,我有一个密码保护的zip文件[以base64编码数据和zip文件名的形式],其中包含一个xml。我希望在不向磁盘写入任何内容的情况下解析该xml。在Zip4j中如何实现这一点?下面是我试过的 String docTitle = request.getDocTitle(); byte[] decodedFileData = Base64.getDecoder().decode(request.getBase64Data()); InputStrea

我有一个密码保护的zip文件[以base64编码数据和zip文件名的形式],其中包含一个xml。我希望在不向磁盘写入任何内容的情况下解析该xml。在Zip4j中如何实现这一点?下面是我试过的

        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:文件“xyz.xml”在
FileUtils.openInputStream(extractedFile)
行不存在。你能告诉我正确的方法吗?

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

你的情况:

        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
        }

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

你的情况:

        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
        }

我认为您遗漏了一些东西,
新文件(fileTitle)
将简单地打开文件系统中已经存在的文件,您需要的是从zip内部读取zipInputStream。也许您遵循了一些将zip条目写入该文件的代码,该文件应该是字节的目标,但您没有使用outputstream+inputstream,使用第二部分,您可以通过字节[]直接读取内存,我认为您缺少了一些内容,
新文件(fileTitle)
将简单地打开文件系统中已经存在的文件,您需要的是从zip内部读取zipInputStream。也许您遵循了一些将zip条目写入该文件的代码,该文件应该是字节的目标,但是您没有使用outputstream+inputstream,使用第二部分,您可以通过字节[]直接读取内存