2014-10-20 124 views
1

我希望递归读取压缩文件的内容并将所有找到的文件保存到我的硬盘驱动器。如何阅读压缩文件的内容并保存文件

我读的zip文件是这样的:

def zipFile = new java.util.zip.ZipFile(new File('/Users/birdy/test.zip')) 

zipFile.entries().findAll { !it.directory }.each { 
    def is = zipFile.getInputStream(it) 
    //how do i store this stream to a file? 
} 

如果一个zip文件有下列文件:

folder1/test1.txt 
folder2/test2.jpg 

的话,我希望存储test1.txttest2.jpg我HD

回答

2

这里你去:

import java.util.zip.* 

def zipIn = new File('lol.zip') 
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

几件事情:首先,'文件可能不存在的'新文件(e.name)的父目录。其次,为什么'withWriter'而不是'withInputStream'?这不是假设的人物数据? – bdkosher 2014-10-20 17:10:11

+0

当涉及到父目录时,如果您在处理zip的相同目录中运行脚本,它将会存在。 Steam改变了。 – Opal 2014-10-20 17:14:11

+0

Zip条目名称不一定是一个深度的路径元素。在某些情况下,条目的父目录需要在本地文件系统上创建,但不幸的是,当你开始向文件写入内容时,这不会自动发生。你需要一个明确的'mkdirs()'调用。 – bdkosher 2014-10-20 17:41:14

0

Java代码

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.List; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

public class UnZip 
{ 
    List<String> fileList; 
    private static final String INPUT_ZIP_FILE = "C:\\MyFile.zip"; 
    private static final String OUTPUT_FOLDER = "C:\\outputzip"; 

    public static void main(String[] args) 
    { 
     UnZip unZip = new UnZip(); 
     unZip.unZipIt(INPUT_ZIP_FILE,OUTPUT_FOLDER); 
    } 

    /** 
    * Unzip it 
    * @param zipFile input zip file 
    * @param output zip file output folder 
    */ 
    public void unZipIt(String zipFile, String outputFolder){ 

    byte[] buffer = new byte[1024]; 

    try{ 

     //create output directory is not exists 
     File folder = new File(OUTPUT_FOLDER); 
     if(!folder.exists()){ 
      folder.mkdir(); 
     } 

     //get the zip file content 
     ZipInputStream zis = 
      new ZipInputStream(new FileInputStream(zipFile)); 
     //get the zipped file list entry 
     ZipEntry ze = zis.getNextEntry(); 

     while(ze!=null){ 

      String fileName = ze.getName(); 
      File newFile = new File(outputFolder + File.separator + fileName); 

      System.out.println("file unzip : "+ newFile.getAbsoluteFile()); 

      //create all non exists folders 
      //else you will hit FileNotFoundException for compressed folder 
      new File(newFile.getParent()).mkdirs(); 

      FileOutputStream fos = new FileOutputStream(newFile);    

      int len; 
      while ((len = zis.read(buffer)) > 0) { 
      fos.write(buffer, 0, len); 
      } 

      fos.close(); 
      ze = zis.getNextEntry(); 
     } 

     zis.closeEntry(); 
     zis.close(); 

     System.out.println("Done"); 

    }catch(IOException ex){ 
     ex.printStackTrace(); 
    } 
    }  
} 
+1

Java太冗长了.. – Opal 2014-10-20 16:35:03