2014-10-24 4 views
0

Я хотел бы рекурсивно прочитать zip-файл, а затем извлечь все файлы в отдельной папке.Как читать все файлы из zip-файла

Например, если some.zip файл имеет следующее содержание:

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

То, что я хочу, это просто все файлы, включая все файлы в архивные файлы внутри архива (inside.zip в приведенном выше примере).

конечный результат somefolder будет все файлы (я не забочусь о структуре папок):

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

Что я пробовал:

У меня есть код, приведенный ниже, но он поддерживает структура папок и не открывает файлы почтового индекса в файлах почтового индекса:

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) 
      } 
     } 
    } 
} 
+0

вам нужно на самом деле проверить, что вы извлечения, например, 'if (файл извлекается = '.zip') {open (файл извлекается); } ' –

+0

Что такое ZipFile? Это особый класс? –

+0

@AlvinBunk import java.util.zip. * – Anthony

ответ

1
  • Итерация по записям
  • Если файл не является .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")); 
    } 
    
+0

Это не работает, когда zip-файл имеет фильтр, как в примере, который я показал. – Anthony

+0

Я имел в виду папку * – Anthony

+0

Отредактировано, если вы хотите пропустить папки. Просто добавьте if (entry.isDirectory()) continue; – Maxaon3000

Смежные вопросы