【问题标题】:How to read data in one zip file located in another zipfile using ZipEntry?如何使用 ZipEntry 读取位于另一个 zipfile 中的一个 zip 文件中的数据?
【发布时间】:2014-09-03 22:15:07
【问题描述】:

我有一个 zip 文件 (x.zip),其中还有另一个 zip 文件 (y.zip)。我需要读取 y.zip 中的文件。如何遍历这两个 zip 文件来读取文件?

我用来迭代 x.zip 以读取 y.zip 的代码如下。

在代码中,“zipX”代表“x.zip”。当遇到“y.zip”时,它满足代码中的“if 条件”。在这里,我需要遍历“zipEntry”并读取其中的文件。

如何做到这一点?

private void getFileAsBytes(String path, String name) throws IOException {
        ZipFile zipX = new ZipFile(path);
        Enumeration<? extends ZipEntry> entries = zipX.entries();
        while (entries.hasMoreElements())
        {
            ZipEntry zipEntry = entries.nextElement();
            if(zipEntry.getName().contains(name) && zipEntry.getName().endsWith(".zip")) {
                InputStream is;
                is = zipX.getInputStream(zipEntry);
                // Need to iterate through zipEntry here and read data from a file inside it.
                break;
            }
        }
        zipX.close();
}

【问题讨论】:

  • 如何使用递归方法直到结束??
  • 将内部InputStream 包裹在ZipInputStream 中,并像普通的zip“文件”一样读取...
  • @MadProgrammer 如果 Y.zip 里面有另一个 zip 文件怎么办?他需要继续使用 if/else 块..
  • @Vikram 是的......但是他们还有什么其他选择。我会以递归方式编写该方法,这样他们就可以继续调用,直到他们找到烂摊子的底部......
  • 我怀疑这是不可能的,除非将内部 zip 重构为“真实”文件。邮政编码需要“随机”寻址 zip 文件。

标签: java file inputstream zip


【解决方案1】:

根据ZipFile docs,需要传入一个File对象或者文件路径;不支持 InputStream。

考虑到这一点,您可以将该 InputStream 写入一个临时文件,然后将该文件传递给您现有的方法:

...
is = zipX.getInputStream(zipEntry);
File tmpDir = new File(System.getProperty("java.io.tmpdir"));
//For production, generate a unique name for the temp file instead of using "temp"!
File tempFile = createTempFile("temp", "zip", tmpDir);
this.getFileAsBytes(tempFile.getPath(), name);
break;
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多