解压缩与压缩(高级流)

解压缩与压缩(高级流)

  • 解压缩流属于输入流,

  • 压缩流属于输出流,

  • 解压本质:

    • 压缩包里每个文件在Java中都是ZipEntry
    • 本质就是把每一个ZipEntry按照层级拷贝到本地另一个文件夹中
    package io流;
    
    import java.io.*;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    
    public class jieyasuo {
        public static void main(String[] args) {
            //1.创建一个File表示要解压的压缩包
            File src = new File("D:\\code\\练习文件.zip");
            
            //2.创建一个File表示解压的目的地
            File dest = new File("D:\\");
    
            //调用方法
        }
    
        public static  void unzip(File src,File dest) throws IOException {
            //解压的本质:把压缩包里的每一个文件夹,文件读取出来,按照层级拷贝到目的地当中
    
            //创建一个解压缩流用来读取压缩包中的数据
            ZipInputStream zip = new ZipInputStream(new FileInputStream(src));
            /*1.在Java的IO体系中,字节流和字符流是**处理数据的最底层,最基础的方式**
            2.对于ZipInputStream来说,他的功能是  解析zip格式的压缩包结构,但他本身不能直接读取文件--必须依赖一个字节输入流来提供原始字节数据,他才能基于这些字节解析出压缩包具体内容,最终实现解压逻辑
            3.简单说,字节输入流是数据载体,ZipInputStream是解析器
            */
            
            //要先获取压缩包里面的每一个zipentry对象
    
            //表示当前在压缩包中获取的文件或文件夹
            ZipEntry entry;
            
            while ((entry=zip.getNextEntry())!=null){
                System.out.println(entry);
                if(entry.isDirectory()){
                   //isDirectory同ifFile的作用一样,判断是否文件夹
                   //文件夹:需要在目的地dest创建一个同样的文件夹
                   
                   File file = new File(dest,entry.toString());
                    file.mkdirs();
                }else{
                    //文件:需要读取到压缩包中的文件,并把他存放到目的地dest当中(按照层级目录进行存放)
                    FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString()));
                    int b;
                    while ((b=zip.read())!=-1){
                        //写道目的地
                        fos.write(b);
                    }
                    fos.close();
                    //表示在压缩包中的一个文件夹处理完毕了
                    zip.closeEntry();
                }
            }
            zip.close();
        }
    }
    
  • 压缩

    • 单个文件
    package io流;
    
    import java.io.*;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    public class yasuo {
        public static void main(String[] args) throws IOException {
    
    
        /*
        压缩流
    
         */
    
            //1.创建File对象表示要压缩的文件
            File src = new File("D:\\aaa.txt");
            //2.创建File对象表示压缩包的位置
            File dest = new File("D:\\");
            //3.调用方法来压缩
            toZip(src, dest);
        }
        public static  void toZip(File src,File dest) throws IOException {
            //1.创建压缩流关联压缩包
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"a.zip")));
            //2.创建ZipEntry对象,表示压缩包里面的每一个文件和文件夹
            ZipEntry entry=new ZipEntry("a.txt");
            //3.把ZipEntry对象放到压缩包当中
            zos.putNextEntry(entry);
            //4.把src文件中的数据写道压缩包当中
            FileInputStream fis = new FileInputStream(src);
            int b;
            while((b=fis.read())!=-1){
                zos.write(b);
            }
            zos.closeEnry();
            zos.close();
    
        }
    }
    
  • 多个文件,文件夹

package io流;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class duoyasuo {
    public static void main(String[] args) throws IOException {


        //1.创建File对象表示要压缩的文件
        File src = new File("D:\\aaa");
        //2.创建File对象表示压缩包放在那里(压缩包的父级路径)
        File destparent = src.getParentFile();//D:\\
        //3.创建File对象表示压缩包的路径
        File dest = new File(destparent, src.getName() + ".zip");
        //4.创建压缩流关联压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        //5.获取src里面的每一个文件,编程ZipEntry对象,放入到压缩包中
        toZip(src, zos, src.getName());
    }

    private static void toZip(File src, ZipOutputStream zos, String name) throws IOException {
        //1.进入文件夹
        File[] files=src.listFiles();
        //2.便利数组
        for (File file : files) {
            if(file.isFile()){
                //3.判断-文件,变成ZipEntry对象,放入到压缩包当中
                ZipEntry entry=new ZipEntry(name+"\\"+file.getName());
                zos.putNextEntry(entry);
            }else{
                //4.判断-文件夹,递归
                toZip(file,zos,name+"\\"+file.getName());
            }

        }
    }
}
posted @ 2025-11-01 13:40  RIcard  阅读(8)  评论(0)    收藏  举报