文章目录
- 前言
 - 一、ZIP压缩输出流是什么?
 - 二、使用介绍 
   
- 1.使用方法
 - 2.实操展示
 
 - 总结
 
前言
该篇文章相对应的介绍如何使用java代码将各种文件(文件夹)从ZIP压缩文件中取出到指定的文件夹中。解压流将ZIP文件中的文件以条目的形式逐一读取,数据写入对应创建的文件夹中。
一、ZIP压缩输出流是什么?
Zip压缩输出流是指将数据从Zip文件中解压到指定文件的输出流。ZipInoutStream类可读取ZIP压缩格式的文件,包括已压缩和未压缩的条目(entry)。
二、使用介绍
1.使用方法
(1)构造方式:
new ZipInputStream(InputStream in);
//该构造方式参数 in 为输出流对象  
(2)常用方法:
| 方法 | 功能描述 | 
| read(byte[] b,int off,int len) | 读取字节数组b内off偏移量的位置,长度是len字节 | 
| available() | 判断是否已读完目前entry所指定的数据。已读完返回0,否则返回1 | 
| closeEntry() | 关闭当前ZIP条目并定位流以读取下一个条目 | 
| skip(long n) | 跳过当前ZIP条目中的指定字节数 | 
| getNextEntry() | 读取下一个ZipEntry,并将流内的位置移至该entry所指数据的开头 | 
| createZipEntry(String name) | 以指定的name参数新建一个ZipEntry对象 | 
解压流程图
 
2.实操展示
代码如下(示例):
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class DeZip1 {
    public static void unzipFile(File zipFile, String destDirectory) {
        byte[] buffer = new byte[1024]; //创建缓存区
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
            ZipEntry zipEntry = zis.getNextEntry(); //开启Zip条目
            while (zipEntry != null) {  //循环读取全部压缩文件
                String fileName = zipEntry.getName();   //获取压缩文件名称
                //创建解压文件   
                File newFile = new File(destDirectory + File.separator + fileName); 
                if (zipEntry.isDirectory()) {   //若条目为文件夹,创建完整的文件夹目录
                    newFile.mkdirs();
                } else {    //若条目为文件
                    //创建解压文件的父目录,确保解压文件目录结构正常
                    new File(newFile.getParent()).mkdirs();
                    //创建文件输入流 
                    try (FileOutputStream fos = new FileOutputStream(newFile)) {    
                        int len;
                        //解压流将数据从压缩包读取,输入流将数据写入解压文件中
                        while ((len = zis.read(buffer)) > 0) {  
                            fos.write(buffer, 0, len);
                            fos.flush();
                        }
                    }
                }
                zipEntry = zis.getNextEntry();
            }
            zis.closeEntry();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        File zipFile = new File("D:/word.zip");
        String destDirectory = "D:/word";
        unzipFile(zipFile, destDirectory);
    }
} 
运行结果:
压缩包中的文件
运行后文件被解压到了指定文件

mkdirs()方法如何获取到文件的路径?
mkdirs() 方法是 Java 中的一个文件夹创建方法,用于创建一个文件夹以及它的所有父文件夹。该方法会返回一个 boolean 类型的值,表示文件夹是否创建成功。
mkdirs() 方法获取文件夹路径的方式主要通过传入参数来实现。你可以在方法中传入一个字符串类型的参数,该参数表示文件夹的路径。例如:
File dir = new File("C:\\Users\\username\\Documents\\myFolder"); dir.mkdirs();在上述代码中,我们首先创建了一个 File 对象,然后传入一个字符串类型的参数 “C:\Users\username\Documents\myFolder”,表示要创建的文件夹路径。然后调用 mkdirs() 方法创建该文件夹及其父文件夹。
mkdirs()方法具体是如何获取创建多层目录的?
mkdirs()方法是Java中File类提供的一个方法,用于创建多级目录。
该方法的实现原理是:在创建指定路径的目录时,如果该目录的上级目录不存在,则会先创建上级目录,再创建指定目录。
具体的实现过程可以简单描述为以下几步:
1.将传入的路径分割成各级目录名(使用File.separatorChar分割);
2.从最上级目录开始逐层判断是否存在,如果不存在则创建该目录;
3.重复步骤2,直到所有目录都创建完成。
例如,假设要创建路径为"/a/b/c/d"的目录,而其中的上级目录"a"、“a/b”、"a/b/c"都不存在,则mkdirs方法会按照以下步骤进行创建:分割路径,得到目录名数组:[“”, “a”, “b”, “c”, “d”]
判断目录""是否存在,不存在则创建
判断目录"a"是否存在,不存在则创建
判断目录"a/b"是否存在,不存在则创建
判断目录"a/b/c"是否存在,不存在则创建
判断目录"a/b/c/d"是否存在,不存在则创建
这样就完成了整个路径的创建。
总结
以上就是使用ZipinputStream类解压ZIP文件的介绍,本文仅简单介绍了ZipInputStream流的使用,而ZipInputStream流更多的实战经验仍然需要我们在项目和实践中获取。有拓展或指正的内容欢迎在评论区中留言。


















