如何从zip文件中读取所有文件

时间:2014-10-24 21:30:21

标签: java groovy zip

我想以递归方式读取zip文件,然后在单独的文件夹中提取所有文件。

例如,如果some.zip文件包含以下内容:

file5.txt
somefolder
  file.txt
  file4.txt
inside.zip 
  file2.txt
  file3.txt

我想要的只是所有文件,包括zip文件中的zip文件中的所有文件(上例中的inside.zip)。

somefolder的最终结果将是所有文件(我不关心文件夹结构):

file5.txt
file.txt
file4.txt
file2.txt
file3.txt

我尝试了什么:

我有下面的代码,但它维护文件夹结构,并且不会在zip文件中打开zip文件:

import java.util.zip.*
def extractZip (String zipFile) {
    def zipIn = new File(zipFile)
    def zip = new ZipFile(zipIn)

    zip.entries().findAll { !it.directory }.each { e ->
        (e.name as File).with{ f ->
            f.parentFile?.mkdirs()
            f.withOutputStream { w ->
                w << zip.getInputStream(e)
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  • 迭代条目
  • 如果文件不是.zip文件,则将其解压缩
  • 如果文件是zip文件,则获取其输入的inputStream。创建一个新的ZipInputStream。提取流。

    public void extract(ZipInputStream zipFile, File outputDir) throws IOException
    {
    ZipEntry entry;
    while  ( ( entry = zipFile.getNextEntry()) != null)
    {
       if (entry.isDirectory())
         continue;
       if (entry.getName().endsWith(".zip"))
       {
           extract(new ZipInputStream(zipFile), outputDir);
       }
       else
       {
           extractToDir(zipFile, new File (outputDir, entry.getName()));
    
       }
    
    }
    }
    
    private void extractToDir(ZipInputStream zipFile, File outFile) throws       FileNotFoundException
    {
          ByteStreams.copy(zipFile, new FileOutputStream(outFile));
    }
    
    
    
    public static void main(String... args)
    {
         extract(new ZipInputStream(new FileInputStream(zipFileName)), new File("outputPath"));
    }