如何读取Zip文件内部的Zip文件内部文件的内容

时间:2019-10-09 05:52:46

标签: java zip

邮编结构:-

OuterZip.zip--|
              |--Folder1---InnerZip.zip--|
                                         |--TxtFile1.txt    // Requirement is to read content of txt file 
                                         |--TxtFile2.txt    // Without extracting any of zip file

现在我能够读取txt文件的名称,但不能读取其中的内容。

代码:-

public static void main(String arg[]){
ZipFile zip = new ZipFile("Outer.zip");
ZipEntry ze;
for (Enumeration e = zip.entries(); e.hasMoreElements();) {
    ZipEntry entry = (ZipEntry) e.nextElement();
    ZipInputStream zin = new ZipInputStream(zip.getInputStream(entry));
    while ((ze = zin.getNextEntry()) != null)
    {
        System.out.println(ze.getName());                                 //Can read names of txtfiles, Not contents
        zip.getInputStream(ze); // It is giving null
    }
}
}

PS:-1.希望在不提取文件系统中任何zip的情况下进行操作。
      2.已经在SOF上看到了一些答案。

1 个答案:

答案 0 :(得分:1)

ZipFile zip = new ZipFile("Outer.zip");
...
zip.getInputStream(ze); // It is giving null

ze(例如TxtFile1.txt)的内容是InnerZip.zip的一部分,而不是Outer.zip(由zip代表)的一部分,因此是null。 / p>

我将使用递归:

public static void main(String[] args) throws IOException {
     String name = "Outer.zip";
     FileInputStream input = new FileInputStream(new File(name));
     readZip(input, name);
}

public static void readZip(final InputStream in, final String name) throws IOException {
    final ZipInputStream zin = new ZipInputStream(in);
    ZipEntry entry;
    while ((entry = zin.getNextEntry()) != null) {
        if (entry.getName().toLowerCase().endsWith(".zip")) {
            readZip(zin, name + "/" + entry.getName());
        } else {
            readFile(zin, entry.getName());
        }
    }
}

private static void readFile(final InputStream in, final String name) {
    String contents = new BufferedReader(new InputStreamReader(in)).lines().collect(Collectors.joining("\n"));
    System.out.println(String.format("Contents of %s: %s", name, contents));
}

0。 while (...),我们正在遍历整个所有条目。

1。if (.endsWith(".zip"))),如果遇到另一个我们本身递归调用的zip(readZip()),然后转到步骤 0。 < / p>

2。else),否则我们将打印文件的内容(此处为文本文件)。