• JAVA笔记整理-File文件类-压缩流和解压流


    一、文件的压缩流和解压流

    1、为什么需要使用压缩文件

    文件压缩使用场景: 在文件上传或下载中需要操作多个文件时,如果一个一个复制需要花较长时间,而且比较繁琐,javaAPI提供一种压缩/解压文件方式,可以将多个文件打包成一个文件(.zip)

    包: java.util.zip

    常用类: ZipEntry: 表示压缩文件中的每一个实体文件

    ​ ZipFile: 表示压缩文件对象

    ​ ZipOutputStream: 表示压缩文件输出流,用于将普通文件写出到zip文件中

    ​ ZipInputStream: 表示解压文件的输入流,用于读zip文件中的每一个实体ZipEntry

    这里的abcd.txt就是一个ZipEntry

    2、压缩文件步骤

    ​ a、创建需要压缩文件的输入流(InputStream )

    ​ b、创建压缩包所在的路径,并指定压缩文件名,同时创建ZipOutputStream输出流

    ​ c、将文件对象 添加到 ZipOutputStream中的实体中(也可以指定压缩后的实体名称)

    ​ d、文件复制

    ​ e、关闭流

     public static void main(String[] args) throws IOException {
             // 1、创建文件对象
            File file = new File("d:/小众网站.txt");
            // 2、创建文件的输入流
            FileInputStream fis  = new FileInputStream(file);
            // 3、创建文件压缩流(输出流)
            ZipOutputStream zos = new ZipOutputStream(
                    new FileOutputStream("d:/myfile.zip"));
    
            // 给压缩包中添加文件,并可自定义文件名
            zos.putNextEntry(new ZipEntry("小众网站.txt "));
            // 给压缩包设置注释
            zos.setComment("这是压缩包的注释。。。。");
            // 文件复制
            int len = 0;
            byte [] b = new byte[1024];
            while( (len = fis.read(b)) !=-1){
                zos.write(b,0,len);
            }
            System.out.println("文件压缩成功");
    
            zos.close();
            fis.close();
    
        }
    

    压缩多个文件

     /**
         * 压缩一个文件夹  myfile
         * @param args
         */
        public static void main(String[] args) throws IOException {
    
            //构建压缩包的输出流
            ZipOutputStream zos = new ZipOutputStream(
                            new FileOutputStream("d:/myfile.zip"));
            File file=new File("d:/myfile");
            File [] files =  file.listFiles();
    
            for(File f : files){
                 //构造每一个文件的输入流
                FileInputStream fis  = new FileInputStream(f);
                putZipFile(fis, zos ,f.getName());
                System.out.println(f.getName()+"文件压缩成功" );
            }
    
            //关闭压缩流
            zos.flush();
            zos.close();
    
    
        }
    
        /**
         * 将文件放入压缩流中
         * @param fis
         * @param zos
         * @param entryName
         * @throws IOException
         */
        public static void putZipFile(InputStream fis ,
                                      ZipOutputStream zos,
                                      String entryName) throws IOException {
            // 给压缩包中添加文件,并可自定义文件名
            zos.putNextEntry(new ZipEntry(entryName));
            // 给压缩包设置注释
            zos.setComment("这是压缩包的注释。。。。");
            // 文件复制
            int len = 0;
            byte [] b = new byte[1024];
            while( (len = fis.read(b)) !=-1){
                zos.write(b,0,len);
            }
            System.out.println("文件压缩成功");
    
    
            fis.close();
        }
    
    

    3、解压文件步骤

    ​ 解压文件是将一个.zip文件的内容,复制到文件下,需要使用ZipInputStream

    ​ 解压文件的关键点: 获取解压文件的每一个条目ZipEntry的输入流 ,将输入流写出到指定位置。

    ​ 如何获取输入流: ZipFile对象 表示一个zip文件

    步骤:

    ​ a、根据文件路径 创建ZipInputStream

    ​ b、根据文件路径创建ZipFile对象

    ​ c、循环遍历每一天条目, 得到它的ZipEntry

    ​ d、获取ZipEntry的输入流

    ​ e、将文件复制到指定位置

       public static void main(String[] args) throws IOException {
              //1、创建ZipInputStream
            ZipInputStream zis = new ZipInputStream(
                    new FileInputStream("d:/myfile.zip"));
            // 2、创建ZipFile对象
            ZipFile zipFile = new ZipFile("d:/myfile.zip");
             // 3、获取zip中的实体
            ZipEntry en = null;
            while(  (en= zis.getNextEntry())!=null){
                System.out.println(en.getName()+"--"+en.isDirectory());
                //4、获取每一个en的输入流 (关键)
                InputStream is =   zipFile.getInputStream(en);
                copyFile(is ,"d:/my",en.getName());
            }
        }
    
        /**
         * 通过输入流 复制文件到指定的目录下
         * @param is  输入流
         * @param path  存放文件的路径
         * @param fileName  文件名
         */
        public static void copyFile(InputStream is , String path , String fileName) throws IOException {
              File file = new File(path);
              //判断目录是否存在, 不存在就 创建
              if(!file.exists()){
                  file.mkdirs();
              }
    
            FileOutputStream fos = new FileOutputStream(path+File.separator+fileName);
            int len = 0 ;
              byte [] b = new byte[1024];
              while( (len = is.read(b)) !=-1){
                    fos.write(b,0,len);
              }
              System.out.println("解压成功");
              fos.close();
              is.close();
        }
    
  • 相关阅读:
    HDU5000 (DP + 规律)
    HDU5127 神坑题---vector 、 list 、 deque 的用法区别
    HDU5128 细心、细心、细心
    dij单源最短路纯模板
    POJ 1236 SCC+缩点
    SCC(强连通分量)
    用树状数组求数组内的逆序对数
    HDU 1811 并查集
    大数模板,只要不是手敲,非常好用
    市赛
  • 原文地址:https://www.cnblogs.com/z5452830/p/13944516.html
Copyright © 2020-2023  润新知