如何读取 zip 文件的内容并保存文件

Posted

技术标签:

【中文标题】如何读取 zip 文件的内容并保存文件【英文标题】:How to read contents of zip file and save files 【发布时间】:2014-10-20 15:58:13 【问题描述】:

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

我正在阅读这样的 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

【问题讨论】:

【参考方案1】:

给你:

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)
        
    

一切都清楚了吗?

【讨论】:

有几件事:首先,new File(e.name) 文件的父目录可能不存在。第二,为什么withWriter 而不是withInputStream?那不是假设字符数据吗? 当涉及到父目录时,如果您在处理 zip 的同一目录中运行脚本,它将存在。 Steam 已更改。 Zip 条目名称不一定是一个路径元素深度。在某些时候,需要在本地文件系统上创建条目的父目录,不幸的是,当您开始将内容写入文件时,这不会自动发生。你需要一个明确的mkdirs() 调用。 是的,你说得对,但我假设在编写脚本时没有子目录。随意编辑帖子。 @cfrick,e 定义在哪里?【参考方案2】:

使用 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(); 
    
       

【讨论】:

以上是关于如何读取 zip 文件的内容并保存文件的主要内容,如果未能解决你的问题,请参考以下文章

python 怎么读取网络zip字节流,并保存到本地zip文件中?

如何从 zip 文件夹中的 csv 文件中读取数据并将 csv 文件中的数据保存在数据库中?

如何将pdf存储在zip文件中,而不在本地保存

如何从 zip 中提取 csv 文件并在 python 中将其保存到磁盘? [复制]

将文件压缩到内存并以字节python的形式读取整个存档

ZIP文件格式。如何正确读取文件?