zoukankan      html  css  js  c++  java
  • Java实现ZIP解压功能

    1.引入依赖

    <dependency>
                <groupId>org.apache.ant</groupId>
                <artifactId>ant</artifactId>
                <version>1.9.6</version>
    </dependency>

    2.Java代码

    public class ZipUtils {
        private static Logger logger = LoggerFactory.getLogger(ZipUtils.class);
    
        /**
         *ZIP文件解压操作类
         * @param path 解压的ZIP源文件路径 必须
         * @param goalPath  解压的目标文件夹路径 非必须
         * @param perFileName   解压文件的文件名前缀 非必须
         * @return  返回解压图片和图片路径
         * @throws Exception
         */
        public static HashMap<String,String> unZip(String path, String goalPath, String perFileName) throws Exception{
            int count = -1;
            int index = -1;
            String savePath = "";
            InputStream in = null;
            FileOutputStream fos = null;
            BufferedOutputStream bos = null;
            String goal_fileName ="";
            int bufLength  = 1024;
            byte[] b = null;
            HashMap<String,String> fileNameMap = new HashMap<String, String>();
            try {
                logger.debug("--解压缩文件:"+path);
                ZipFile localFile = new ZipFile(path);
                Enumeration<?> entries = localFile.getEntries();
                while(entries.hasMoreElements()){
                    byte[] buf = new byte[bufLength];
                    ZipEntry tmpEntry = (ZipEntry) entries.nextElement();
                    String fileName = tmpEntry.getName();
    //              得到文件的扩展名
                    String file_ext_name = fileName.substring(fileName.lastIndexOf(".") + 1);
    
                    if(file_ext_name.equals("jpg")||file_ext_name.equals("jpeg")||file_ext_name.equals("png")||file_ext_name.equals("gif")
                            ||file_ext_name.equals("bmp")){
        //              设置文件解压缩目标文件夹
                        if(goalPath!=null&&goalPath.length()!=0){
                            savePath = goalPath+ "/";
                        }else{
                            savePath = path.substring(0, path.lastIndexOf(".")) + "/";
                        }
    
                        File unZipFile = new File(savePath);
                        if(!unZipFile.exists()){
                            unZipFile.mkdir();
                            logger.debug("--解压缩输出目标文件夹不存在,创建目标文件夹"+savePath);
                        }
    //               组装解压的目标文件
                        if(perFileName!=null&&perFileName.length()!=0){
                            goal_fileName = perFileName+"_"+fileName;
                        }else{
                            goal_fileName =  fileName;
                        }
                        // 上传的图片格式
                        fileName = savePath + goal_fileName;
                        logger.debug("--解压文件:"+fileName);
    
                        File file = new File(fileName);
                        file.createNewFile();
                        in = localFile.getInputStream(tmpEntry);
    
                        fos = new FileOutputStream(file);
                        bos = new BufferedOutputStream(fos,bufLength);
                        while((count = in.read(buf))>-1){
                            bos.write(buf,0,count);
                        }
                        fileNameMap.put(goal_fileName,fileName);
                        bos.flush();
        //              关闭资源
                        closeResource(bos,fos,in);
    
        //              如果是gif格式的图片,则生成临时gif文件,并获取gif图片的第一帧
                        if (file_ext_name.trim().equals("gif")|| file_ext_name.trim().equals("GIF")) {
                            logger.debug("####上传的图片格式为:file_ext_name:"+file_ext_name);
                            // 临时文件夹
                            String tmpUrl = goalPath + "/gifTmp";
                            File gifTmpFiles = new File(tmpUrl);
                            if (!gifTmpFiles.exists()) {
                                gifTmpFiles.mkdirs();
                            }
    
                            // 临时gif图片
                            File gifTmpFile = new File(tmpUrl, goal_fileName);
                            File gifLocalFile = new File(fileName);
                            FileUtil.copyFile(gifLocalFile, gifTmpFile);
    
                            // 获取gif图片的第一帧
                            try{
                                b = ImageUtils.returnGifFirstByte(gifTmpFile.getAbsolutePath());
                            }catch (Exception e){
                                logger.error("--获取gif图片的第一帧失败",e);
                                throw new Exception(e);
                            }
    
                            // 删除临时gif图片
                            logger.debug("####删除GIF文件临时文件:gifTmpFile:"+gifTmpFile.getAbsolutePath());
                            gifTmpFile.delete();
                            logger.debug("####删除GIF本地解压文件:gifLocalFile:"+gifLocalFile.getAbsolutePath());
                            //删除原始本地GIF图片
                            gifLocalFile.delete();
                            // 保存原图片
                            if (b == null || b.length <= 0) {
                                logger.error("GIF文件为空,解压失败!"+fileName);
                                throw new Exception("gif fail");
                            }else{
    
                                fileName = fileName.substring(0,fileName.lastIndexOf("."))+".jpg";
                                logger.debug("####GIF文件转换为本地JPG文件:fileName:"+fileName);
                                FileOutputStream out = new FileOutputStream(fileName);
                                out.write(b);
                                out.close();
                            }
                        }
                        fileNameMap.put(goal_fileName,fileName);
                    }else{
                        logger.error("#####文件格式不合法,拒绝解压缩!fileName:"+fileName);
                    }
    
                }
    //           删除解压缩文件
                    Util.delUrlLocalFile(path);
    
                try {
                    if(localFile!=null){
                        localFile.close();
                    }
                } catch (IOException e) {
                    logger.error("localFile关闭失败!",e);
                    localFile.close();
    
                }
            } catch (Exception e) {
                logger.error("zip文件解压失败!",e);
                throw new Exception(e);
            }
            return fileNameMap;
    
        }
    
    
        public static void closeResource(BufferedOutputStream bos,FileOutputStream fos,InputStream in){
            try{
                if(bos!=null){
                    bos.close();
                }
            }catch(Exception e){
                logger.error("BufferedOutputStream关闭失败!",e);
            }
    
            try{
                if(fos!=null){
                    fos.close();
                }
            }catch(Exception e){
                logger.error("FileOutputStream关闭失败!",e);
            }
    
            try{
                if(in!=null){
                    in.close();
                }
            }catch(Exception e){
                logger.error("inputstream关闭失败!",e);
                }
        }
    
    }

    由于涉及的业务是图片的打包文件,代码仅写了图片文件的解压。

  • 相关阅读:
    c# TCP高性能通信
    c#实现的HTTP服务端
    c#的二进制序列化组件MessagePack介绍
    c# 任务超时执行
    c#项目总结
    etcd客户端c#
    开发的服务集群部署方案,以etcd为基础(java)
    udt的java版本judt项目持续升级1.2版本
    udt通信java再次升级1.1版
    (转)Spring Boot(二) & lombok
  • 原文地址:https://www.cnblogs.com/sagech/p/5653547.html
Copyright © 2011-2022 走看看