Java 压缩流和解压缩流

148 阅读3分钟

压缩流和解压缩流

Snipaste_2022-12-25_13-43-26.png

解压缩流ZipInputStream

  • 压缩包里面的每一个文件或文件夹都是一个ZipEntry对象
  • 解压本质:把每一个ZipEntry对象按照层级拷贝到本地另一个文件夹中

解压

public static void main(String[] args) throws IOException {
    //创建一个File表示要解压的压缩包
    File scr = new File("xxx.zip");
    //创建一个File表示解压的目的地
    File dest = new File("...");
    //调用方法
    unZip(src, dest);
}

//定义一个方法用来解压
public static void unZip(File src, File dest) throws IOException {
    //解压的本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地当中
    
    //创建一个解压缩流用来读取压缩包中的数据
    ZipInputStream zis = new ZipInputStream(new FileInputStream(src));
    //要先获取到压缩包里面的每一个zipEntry对象
    
    //表示当前在压缩包中获取到的文件或者文件夹
    ZipEntry entry;
    
    while ((entry = zis.getNextEntry()) != null) {
        if (entry.isDirectory()) {
            //文件夹:需要在目的地dest处创建一个同样的文件夹
            File file = new File(dest, entry.toString());
            file.mkdirs();
        } else {
            //文件:需要读取到压缩包中的文件,并把它存放到目的地dest文件夹中(按照层级目录进行存储)
            FileOutputString fos = new FileOutputStream(new File(dest, entry.toString()));
            int b;
            while ((b = zis.read()) != -1) {
                //写到目的地
                fos.write(b);
            }
            fos.close();
            //表示在压缩包中的一个文件处理完毕了
            zis.closeEntry();
        }
    }
    zis.close();
}

压缩流ZipOutputStream

  • 压缩包里面的每一个文件或文件夹都是一个ZipEntry对象
  • 压缩本质:把每一个文件/文件夹看作ZipEntry对象放到压缩包中

压缩单个文件

public static void main(String[] args) throws IOException {
    //创建一个File表示要压缩的文件
    File scr = new File("...\\a.txt");
    //创建一个File表示压缩包的位置
    File dest = new File("...");
    //调用方法
    toZip(src, dest);
}

public static void toZip(File src, File dest) throws IOException {
    //创建压缩流关联压缩包
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest, "a.zip")));
    //创建ZipEntry对象,表示压缩包里面的每一个文件和文件夹
    ZipEntry entry = new ZipEntry("a.txt");
    //把ZipEntry对象放到压缩包当中
    zos.putNextEntry(entry);
    //把src文件中的数据写到压缩包当中
    FileInputStream fis = new FileInputStream(src);
    int b;
    while ((b = fis.read()) != -1) {
        zos.write(b);
    }
    zos.closeEntry();
    zos.close();
}

压缩文件夹

public static void main(String[] args) throws IOException {
    //创建一个File表示要压缩的文件夹
    File scr = new File("...\\aaa");
    //创建一个File表示压缩包放在那里(压缩包的父级路径)
    File destParent = src.getParentFile();
    //创建File对象表示压缩包的路径
    File dest = new File(destParent, scr.getName() + ".zip");
    //创建压缩流关联压缩包
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
    //获取src里面的每一个文件,变成ZipEntry对象,放入到压缩包当中
    toZip(src, zos, src.getName());
    //释放资源
    zos.close();
}

//获取src里面的每一个文件,变成Zipentry对象,放入到压缩包当中
//参数一:数据源
//参数二:压缩流
//参数三:压缩包内部的路径
public static void toZip(File src, ZipOutputStream zos, String name) {
    //进入scr文件夹
    File[] files = src.listFiles();
    //遍历数组
    for (File file : files) {
        if (file.isFile()) {
            //文件:变成ZipEntry对象,放入到压缩包当中
            ZipEntry entry = new ZipEntry(name + "\\" + file.getName());
            zos.putNextEntry(entry);
            //读取文件中的数据,写到压缩包中
            FileInputStream fis = new FileInputStream(file);
            int b;
            while ((b = fis.read()) != -1) {
                zos.write(b);
            }
            fis.close();
            zos.closeEntry();
        } else {
            //文件夹:递归
            toZip(file, zos, name + "\\" + file.getName());
        }
    }
}