java解析zip压缩文件并将解压后的文件保存到本地

 

ZIpFile.entries() 获取的是压缩包内的所有文件(包括文件夹),不只是第一层的文件(和文件夹)

 

如果是用MultipartFile接收的Zip文件,需要先保存到本地 ,然后再解析:

/**
     * MultipartFile存本地
     * @param file 要保存到本地的文件
     * */
    public static void saveMultipartFile(MultipartFile file) throws IOException{
        //创建根目录
        String savePath = "D:\\temp" ;

        File localFile = new File(savePath+File.separator+file.getOriginalFilename());
        localFile.mkdirs();
        file.transferTo(localFile);
  
    }

解析zip文件并复制文件:

/**
    
     * @param srcFile        zip源文件
     * @param savePath       文件保存路径
     * @throws RuntimeException 解压失败会抛出运行时异常
     * */
    public static void  resolveZip(File srcFile,String savePath) {
        //解压文件
        ZipFile zipFile = null;
        try {
            zipFile = new ZipFile(srcFile, Charset.forName("GBK"));
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while(entries.hasMoreElements()){
                ZipEntry zipEntry = entries.nextElement();
                //判断是文件夹 或者 文件
                if(zipEntry.isDirectory()){
                   continue;
                }else{                              
                         //保存到本地
                         String fileName = zipEntry.getName();
                         //获取的文件,如果存在父级,文件名会显示父级路径,所有我们需要手动去掉
                         if(fileName.lastIndexOf("/") != -1){
                             fileName = fileName.substring(fileName.lastIndexOf("/")+1);
                         }
                         File shpFile = new File(savePath + File.separator+fileName);
                         shpFile.createNewFile();
                         copyFile(zipFile.getInputStream(zipEntry),new FileOutputStream(shpFile));
                     }
                
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(zipFile!=null){
                try {
                    zipFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

文件复制公共方法:

 /**
     * 复制文件
     * @param  in 原文件流输入流
     * @param out 目标文件输出流
     * */
    public static void copyFile(InputStream in, OutputStream out) {
        int len ;
        byte[] b = new byte[1024];
        try {
            while ((len = in.read(b,0,1024))!=-1){
                out.write(b,0,len);
                out.flush();
            }
            in.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 

    原文作者:夏夜里的晚风。
    原文地址: https://blog.csdn.net/weixin_42488402/article/details/117962802
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞