zoukankan      html  css  js  c++  java
  • 压缩包解压 获取文件夹目录以及文件工具类

    package com.zy.ruralhouse.utils;
    
    import com.zy.ruralhouse.mapper.RuralInfoMapper;
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipFile;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.*;
    
    /**
     * @Author:pmy
     * @Description:
     * @Date:2020/7/29
     */
    @Component
    public class ZipUtil {
        @Resource
        private RuralInfoMapper ruralInfoMapper;
        /**
         * zip解压
         * @param srcFile        zip源文件
         * @param destDirPath     解压后的目标文件夹
         * @throws RuntimeException 解压失败会抛出运行时异常
         */
        public static String unZipFiles(File srcFile, String destDirPath,String flag) throws RuntimeException {
            long start = System.currentTimeMillis();
            String mdbFilePath=null;
            // 判断源文件是否存在
            if (!srcFile.exists()) {
                throw new RuntimeException(srcFile.getPath() + "所指文件不存在");
            }
            // 开始解压
            ZipFile zipFile = null;
            try {
                zipFile = new ZipFile(srcFile,"gbk");
                Enumeration<?> entries = zipFile.getEntries();
                List<String> filePathList=null;
                Map<String, Object> m = null;
                Map<String,String> mdata=null;
                while (entries.hasMoreElements()) {
                    ZipEntry entry = (ZipEntry) entries.nextElement();
                    String zipEntryName = entry.getName();
                    if("sxsj".equals(flag)){
                        if(!zipEntryName.toLowerCase().endsWith(".mdb")) continue;
                    }
                    System.out.println("解压" + entry.getName());
                    // 如果是文件夹,就创建个文件夹
                    if (entry.isDirectory()) {
                        String dirPath = destDirPath + "/" + zipEntryName;
                        File dir = new File(dirPath);
                        dir.mkdirs();
                    } else {
                        // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
                        String filePath=destDirPath + "/" + zipEntryName;
                        File targetFile = new File(filePath);
                        // 保证这个文件的父文件夹必须要存在
    
                        if(!targetFile.getParentFile().exists()){
                            targetFile.getParentFile().mkdirs();
                        }
                        targetFile.createNewFile();
                        // 将压缩文件内容写入到这个文件中
                        InputStream is = zipFile.getInputStream(entry);
                        FileOutputStream fos = new FileOutputStream(targetFile);
                        int len;
                        byte[] buf = new byte[1024];
                        while ((len = is.read(buf)) != -1) {
                            fos.write(buf, 0, len);
                        }
                        // 关流顺序,先打开的后关闭
                        fos.close();
                        is.close();
                        //获取空间文件集合
                        String fileName=targetFile.getName();
    //                    String namePre = fileName.substring(0, fileName.lastIndexOf("."));
    //                    if(fileName.toLowerCase().endsWith(".dbf")){
    //                        if(mdata==null){
    //                            mdata=new HashMap<>();
    //                            mdata.put("dbfPath",filePath);
    //                        }
    //                    }else if(fileName.toLowerCase().endsWith(".shp")){
    //                        mdata.put("shpPath",filePath);
    //                        m = new HashMap<>();
    //                        m.put("id", namePre);
    //                        m.put("type",namePre.toLowerCase().indexOf("zdjbxx")!=-1?"zdxx":"common");
    //                        m.put("data", mdata);
    //                        pathList.add(m);
    //                        mdata=null;
    //                        m=null;
    //                    }
                        if (fileName.toLowerCase().endsWith(".mdb")) {
                            mdbFilePath = filePath;
                        }
                    }
                }
                long end = System.currentTimeMillis();
                System.out.println("解压完成,耗时:" + (end - start) +" ms");
            } catch (Exception e) {
                throw new RuntimeException("unzip error from ZipUtils", e);
            } finally {
                if(zipFile != null){
                    try {
                        zipFile.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return mdbFilePath;
        }
        /**
         * @param filePath
         * 临时文件的删除
         * 删除文件夹里面子目录
         * 再删除文件夹
         */
        public void deleteFiles(String filePath) {
            File file = new File(filePath);
            if ((!file.exists()) || (!file.isDirectory())) {
                System.out.println("file not exist");
                return;
            }
            String[] tempList = file.list();
            File temp = null;
            for (int i = 0; i < tempList.length; i++) {
                if (filePath.endsWith(File.separator)) {
                    temp = new File(filePath + tempList[i]);
                }
                else {
                    temp = new File(filePath + File.separator + tempList[i]);
                }
                if (temp.isFile()) {
                    temp.delete();
                }
                if (temp.isDirectory()) {
                    this.deleteFiles(filePath + "/" + tempList[i]);
                }
            }
            // 空文件的删除
            file.delete();
        }
    
        /**
         * @param desFile,fileList
         * 获取目录下所有文件,包括子文件夹下的文件
         */
        public List<File> getSubFiles(String  desFile, List<File> fileList) {
            File file = new File(desFile);
            File[] files = file.listFiles();
            for (File fileIndex : files) {
                if (!fileIndex.exists()) {
                    throw new NullPointerException("Cannot find " + fileIndex);
                } else if (fileIndex.isFile()) {
                    fileList.add(fileIndex);
                } else {
                    if (fileIndex.isDirectory()) {
                        getSubFiles(fileIndex.getAbsolutePath(),fileList);
                    }
                }
            }
            return fileList;
        }
    
        public Map<String,Map<String,List<File>>> getFiles(String path,String zddm,String unitId,Map<String,Map<String,List<File>>> o){
            File file = new File(path);
            File[] files = file.listFiles();
            for (File fileIndex : files) {
                if (!fileIndex.exists()) {
                    throw new NullPointerException("Cannot find " + fileIndex);
                } else if(fileIndex.isDirectory()){
                        if(fileIndex.getName().contains(zddm)){
                            if(o==null || o.get(zddm) == null){
                                Map<String,List<File>> pf = new HashMap<>();
                                List<File> f = new ArrayList<>();
                                f=getSubFiles(fileIndex.getAbsolutePath()+"/zd_archives",f);
                                pf.put("宗地附件",f);
                                o.put(zddm,pf);
                            }
                            File mf= new File(fileIndex.getAbsolutePath());
                            File[] ms = mf.listFiles();
                            for(File tf:ms){
                                if(tf.getName().contains(unitId)){
                                    Map<String,List<File>> uf = new HashMap<>();
                                    File ff= new File(tf.getAbsolutePath());
                                    File[] fs = ff.listFiles();
                                    List<File> s = new ArrayList<>();
                                    for(File zf:fs){
                                        if(zf.isFile()){
                                            s.add(zf);
                                            uf.put("房屋附件",s);
                                        }else if (zf.isDirectory()){
                                            if(zf.getName().contains("分户")){
                                                List<File> wf = new ArrayList<>();
                                                wf=getSubFiles(zf.getAbsolutePath(),wf);
                                                uf.put("分层分户图",wf);
                                            } else if(zf.getName().contains("其他")){
                                                List<File> wf = new ArrayList<>();
                                                wf=getSubFiles(zf.getAbsolutePath(),wf);
                                                uf.put("其他附件",wf);
                                            }else{
                                                getFiles(zf.getAbsolutePath(),zddm,unitId,o);
                                            }
                                        }
                                    }
                                    o.put(unitId,uf);
                                }else{
                                    getFiles(tf.getAbsolutePath(),zddm,unitId,o);
                                }
                            }
                            break;
                        }else {
                            getFiles(fileIndex.getAbsolutePath(),zddm,unitId,o);
                        }
                }
            }
            return o;
        }
    
    
        public Map<String,Map<String,List<File>>> getFilesTwo(String path,String zddm,String unitId,Map<String,Map<String,List<File>>> o,Integer status) {
            File file = new File(path);
            File[] files = file.listFiles();
            if (files != null) {
                for (File fileIndex : files) {
                    if (fileIndex.isDirectory()) {
                        if (fileIndex.getParent().contains("扫描档案")) {
                            File zd = new File(fileIndex.getAbsolutePath());
                            File[] zs = zd.listFiles();
                            for (File f : zs) {
                                if (f.getName().contains(zddm)) {
                                    File mf = new File(f.getAbsolutePath());
                                    File[] ms = mf.listFiles();
                                    for (File tf : ms) {
                                        if (tf.getName().contains(unitId)) {
                                            //修改材料上传补录标志 补录的时候需要用
                                            if(status==4){
                                                ruralInfoMapper.updateCommitToBdcByZddm("3",zddm,unitId);
                                            }
                                            Map<String, List<File>> uf = new HashMap<>();
                                            File ff = new File(tf.getAbsolutePath());
                                            File[] fs = ff.listFiles();
                                            List<File> s = new ArrayList<>();
                                            for (File zf : fs) {
                                                if (zf.isFile()) {
                                                    s.add(zf);
                                                    uf.put("房屋附件", s);
                                                } else if (zf.isDirectory()) {
                                                    if (zf.getName().contains("分户")) {
                                                        List<File> wf = new ArrayList<>();
                                                        wf = getSubFiles(zf.getAbsolutePath(), wf);
                                                        uf.put("分层分户图", wf);
                                                    } else if (zf.getName().contains("其他")||zf.getName().contains("其它")) {
                                                        List<File> wf = new ArrayList<>();
                                                        wf = getSubFiles(zf.getAbsolutePath(), wf);
                                                        uf.put("其他附件", wf);
                                                    } else {
                                                        getFilesTwo(zf.getAbsolutePath(), zddm, unitId, o,status);
                                                    }
                                                }
                                            }
                                            o.put(unitId, uf);
                                        } else {
                                            getFilesTwo(tf.getAbsolutePath(), zddm, unitId, o,status);
                                        }
                                    }
                                } else if (f.getName().contains("土地") && f.getParent().contains(zddm)) {
                                    Map<String, List<File>> uf = new HashMap<>();
                                    File mf = new File(f.getAbsolutePath());
                                    File[] ds = mf.listFiles();
                                    for (File df : ds) {
                                        if (df.isDirectory() && df.getName().contains(zddm)) {
                                            File kf = new File(df.getAbsolutePath());
                                            File[] us = kf.listFiles();
                                            for (File kkf : us) {
                                                if (kkf.isDirectory()) {
                                                    if (kkf.getName().contains("地籍调查表")) {
                                                        List<File> wf = new ArrayList<>();
                                                        wf = getSubFiles(kkf.getAbsolutePath(), wf);
                                                        uf.put("地籍调查表", wf);
                                                    } else if (kkf.getName().contains("其他")||kkf.getName().contains("其它")) {
                                                        List<File> wf = new ArrayList<>();
                                                        wf = getSubFiles(kkf.getAbsolutePath(), wf);
                                                        uf.put("宗地其他附件", wf);
                                                    } else if (kkf.getName().contains("宗地图")) {
                                                        List<File> wf = new ArrayList<>();
                                                        wf = getSubFiles(kkf.getAbsolutePath(), wf);
                                                        uf.put("宗地图", wf);
                                                    } else {
                                                        getFilesTwo(df.getAbsolutePath(), zddm, unitId, o,status);
                                                    }
                                                }
                                            }
                                            o.put(zddm, uf);
                                        }
                                    }
                                } else {
                                    getFilesTwo(f.getAbsolutePath(), zddm, unitId, o,status);
                                }
                            }
                        } else {
                            getFilesTwo(fileIndex.getAbsolutePath(), zddm, unitId, o,status);
                        }
                    }
                }
            }
            return o;
        }
    
        public boolean subFileExists(String path,String key){
            File file = new File(path);
            File[] files = file.listFiles();
            for (File fileIndex : files) {
                if (!fileIndex.exists()) {
                    throw new NullPointerException("Cannot find " + fileIndex);
                } else if(fileIndex.isDirectory()){
                    if(fileIndex.getName().contains(key)){
                       return true;
                    }else {
                       if( subFileExists(fileIndex.getAbsolutePath(),key)) return true;
                    }
                }
            }
            return false;
        }
    
    
        public Map<String,String> getMuLu(String path,Map<String,String> map) {
            File file = new File(path);
            File[] files = file.listFiles();
            if(path.endsWith("扫描档案")){
                for (File fileIndex : files) {
                    map.put(fileIndex.getPath().substring(fileIndex.getPath().lastIndexOf("扫描档案")+5),fileIndex.getPath());
                }
                return map;
            }
            if (files != null) {
                for (File fileIndex : files) {
                    if (fileIndex.isDirectory()) {
                        if (fileIndex.getParent().contains("扫描档案")) {
                        } else {
                            getMuLu(fileIndex.getAbsolutePath(),map);
                        }
                    }
                }
            }
            return map;
        }
    
    
        public Map<String,Map<String,List<File>>> getFilesByZddm(String path,String zddm,String unitId,Map<String,Map<String,List<File>>> o,Integer status) {
            File file = new File(path);
            File[] zs = file.listFiles();
            for (File f : zs) {
                if (f.getName().contains(zddm)) {
                    File mf = new File(f.getAbsolutePath());
                    File[] ms = mf.listFiles();
                    for (File tf : ms) {
                        if (tf.getName().contains(unitId)) {
                            //修改材料上传补录标志 补录的时候需要用
                            if(status==4){
                                ruralInfoMapper.updateCommitToBdcByZddm("3",zddm,unitId);
                            }
                            Map<String, List<File>> uf = new HashMap<>();
                            File ff = new File(tf.getAbsolutePath());
                            File[] fs = ff.listFiles();
                            List<File> s = new ArrayList<>();
                            for (File zf : fs) {
                                if (zf.isFile()) {
                                    s.add(zf);
                                    uf.put("房屋附件", s);
                                } else if (zf.isDirectory()) {
                                    if (zf.getName().contains("分户")) {
                                        List<File> wf = new ArrayList<>();
                                        wf = getSubFiles(zf.getAbsolutePath(), wf);
                                        uf.put("分层分户图", wf);
                                    } else if (zf.getName().contains("其他")||zf.getName().contains("其它")) {
                                        List<File> wf = new ArrayList<>();
                                        wf = getSubFiles(zf.getAbsolutePath(), wf);
                                        uf.put("其他附件", wf);
                                    } else {
                                        getFilesByZddm(zf.getAbsolutePath(), zddm, unitId, o,status);
                                    }
                                }
                            }
                            o.put(unitId, uf);
                        } else {
                            getFilesByZddm(tf.getAbsolutePath(), zddm, unitId, o,status);
                        }
                    }
                } else if (f.getName().contains("土地") && f.getParent().contains(zddm)) {
                    Map<String, List<File>> uf = new HashMap<>();
                    File mf = new File(f.getAbsolutePath());
                    File[] ds = mf.listFiles();
                    for (File df : ds) {
                        if (df.isDirectory() && df.getName().contains(zddm)) {
                            File kf = new File(df.getAbsolutePath());
                            File[] us = kf.listFiles();
                            for (File kkf : us) {
                                if (kkf.isDirectory()) {
                                    if (kkf.getName().contains("地籍调查表")) {
                                        List<File> wf = new ArrayList<>();
                                        wf = getSubFiles(kkf.getAbsolutePath(), wf);
                                        uf.put("地籍调查表", wf);
                                    } else if (kkf.getName().contains("其他")||kkf.getName().contains("其它")) {
                                        List<File> wf = new ArrayList<>();
                                        wf = getSubFiles(kkf.getAbsolutePath(), wf);
                                        uf.put("宗地其他附件", wf);
                                    } else if (kkf.getName().contains("宗地图")) {
                                        List<File> wf = new ArrayList<>();
                                        wf = getSubFiles(kkf.getAbsolutePath(), wf);
                                        uf.put("宗地图", wf);
                                    } else {
                                        getFilesByZddm(df.getAbsolutePath(), zddm, unitId, o,status);
                                    }
                                }
                            }
                            o.put(zddm, uf);
                        }
                    }
                } else {
                    getFilesByZddm(f.getAbsolutePath(), zddm, unitId, o,status);
                }
            }
            return o;
        }
    
    
    
    }
    /**
         * 合并文件并解析附件材料数据
         *
         * @return
         */
        @SuppressWarnings("unchecked")
        @ResponseBody
        @RequestMapping("/caiFileMerge")
        public SimpleJsonResult mergeUploadCaiData(String applicationId, String intoFlag, String fileName, String checkData, HttpServletRequest request, HttpServletResponse response) throws Exception {
            if (StringUtils.isBlank(applicationId)) {
                return failureJsonResult("请先上传属性数据");
            }
            Subject subject = SecurityUtils.getSubject();
            //获取所属机构信息
            SysUser user = (SysUser) subject.getPrincipal();
            long start = System.currentTimeMillis();
            FileOutputStream fileOutputStream = null;
            FileChannel inChannel = null;
            FileChannel outChannel = null;
            RuralInfo ruralInfo = ruralInfoMapper.select(applicationId);
            //合并压缩包
            //获取项目的根路径
            String realpath = request.getSession().getServletContext().getRealPath("/");
            final String Temp_Video_Path = "video/" + fileName;
            String fileNameOut = fileName;
            String classFile = URLDecoder.decode(this.getClass().getClassLoader().getResource("/").getPath(), "utf-8");
            String path = classFile + "../static/fileSpace/" + applicationId + "/" + fileNameOut + "/";//总路径,包括zip文件和解压后的文件
            String newFilePath = path + "fileOut";
            String zipPath = path + "zip/" + fileNameOut + ".zip";
            File video = new File(zipPath);
            try {
                //先判断文件的父目录是否存在,不存在需要创建;否则报错
                if (!video.getParentFile().exists()) {
                    video.getParentFile().mkdirs();
                    video.createNewFile();//创建文件
                }
                //创建流
                fileOutputStream = new FileOutputStream(video);
    
                // 转成集合,便于排序
                List<File> fileList = new ArrayList<>();
                fileList = zipUtil.getSubFiles(realpath + Temp_Video_Path + "/", fileList);
                // 从小到大排序
                Collections.sort(fileList, new Comparator<File>() {
    
                    @Override
                    public int compare(File o1, File o2) {
                        String name1 = o1.getName();
                        String name2 = o2.getName();
                        if (Integer.parseInt(name1.substring(0, name1.lastIndexOf("."))) < Integer.parseInt(name2.substring(0, name2.lastIndexOf(".")))) {
                            return -1;
                        }
                        return 1;
                    }
                });
    
                // 输出流
                outChannel = fileOutputStream.getChannel();
                // 合并
                for (File f : fileList) {
                    inChannel = new FileInputStream(f).getChannel();
                    inChannel.transferTo(0, inChannel.size(), outChannel);
                    inChannel.close();
    
                    //获取文件上级目录
                    File prantFile = f.getParentFile();
                    // 删除分片
                    f.delete();
                    if (prantFile.isDirectory() && prantFile.listFiles().length <= 0) {
                        prantFile.delete();
                    }
                }
    
                // 关闭流
                fileOutputStream.close();
                outChannel.close();
                System.out.println("合并文件成功");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fileOutputStream != null) {
                    try {
                        fileOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (inChannel != null) {
                    try {
                        inChannel.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (outChannel != null) {
                    try {
                        outChannel.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            //解析压缩包
            String mdbFilePath = null;
            try {
                mdbFilePath = zipUtil.unZipFiles(video, newFilePath,"fjcl");//解压文件,获取文件路径
            } catch (Exception e) {
                e.printStackTrace();
                //插入错误日志表
                return failureJsonResult("解压执行失败");
            }
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("applicationId", applicationId);
            //if ("0".equals(intoFlag)) {//覆盖导
            //    //删除附件信息
            //    ruralInfoService.removeUpfile(Long.valueOf(app文件上传ftp失败licationId), null);
            //}
            //获取导入成功的房子的不动产单元号和宗地代码集合
            List<Map<String, String>> hlist = ruralInfoService.getHouseList(applicationId);
            Map<String,String> as = new HashMap<>();
            zipUtil.getMuLu(newFilePath,as);
            String info = "";
            if (hlist != null && hlist.size() > 0) {
                for (Map<String, String> m : hlist) {
                    String unitId = m.get("unitid");
                    String zddm = m.get("zddm");
                    if(!as.containsKey(zddm)){
                        continue;
                    }
                    try {
                        ruralInfoService.insertFiles(applicationId, as.get(zddm), zddm, unitId);
                    } catch (Exception e) {
                        System.out.println("======================================"+e.toString());
                        info+=unitId+" "+e.getMessage();
                        continue;
                    }
                }
            } else {
                return failureJsonResult("没有有效的房屋数据导入,请确认");
            }
            //附件材料上传
            ruralInfoService.uploadFile(applicationId,user);
            zipUtil.deleteFiles(path);//删除mdb文件夹
            zipUtil.deleteFiles( path + "zip/" + fileNameOut + "zip");//删除压缩包文件夹
            System.out.println("##################applicationId:"+applicationId+"材料文件上传结束##################");
            if(ruralInfo.getExamineStatus()==4){//材料补录
                //修改同步标志未待同步
                ruralInfoMapper.updateCommitToBdcRural(applicationId,"3");
                System.out.println("##################applicationId:"+applicationId+"材料文件补录开始##################");
                ruralInfoService.imageProcess(applicationId,user);
                System.out.println("##################applicationId:"+applicationId+"材料文件补录结束##################");
                long end = System.currentTimeMillis();
                System.out.println("材料文件补录完成,耗时:" + (end - start) +" ms");
            }
            if(info!=""){
                return failureJsonResult("扫描档案:["+info+"]上传失败,其他附件材料上传成功");
            }
            long end = System.currentTimeMillis();
            System.out.println("附件材料上传成功完成,耗时:" + (end - start) +" ms");
            return successJsonResult("附件材料上传成功");
        }
  • 相关阅读:
    jdk1.8 LongAdder源码学习
    linux 下 vi 文本编辑如何复制一行粘贴删除一行数据
    远程调试
    本机与远程主机指定端口的网络是否连通
    自定义弹窗
    Windows查看占用端口的进程及其对应的应用程序并关闭之
    超实惠:99元阿里云服务器1核2G内存40G硬盘(SSD)
    Java显式锁学习总结之六:Condition源码分析
    Maven使用国内镜像
    深入理解读写锁—ReadWriteLock源码分析
  • 原文地址:https://www.cnblogs.com/pan-my/p/15423507.html
Copyright © 2011-2022 走看看