• java 解压 zip 包并删除


            需求是这样的,  在服务器上有 运营上传的zip 包,内容是用户的照片,我需要做的是 获取这些照片上传,并保存到 数据库。 这里面的 上传照片,保存数据库都不难,主要问题是解压zip包,和删除zip 包,以及 解压后的文件。

          之前在网上找的解压的文件的代码,都存在同一个问题,就是解压之后,无法删除 zip 包。查百度说是 资源占用,可是我已经把所有的流都关闭了哇。

           我把解压和删除分成两部分用 jUnit  测试:   第一次测试解压,并不删除包;第二次只删除包。我发现,解压方法和删除方法在同一个test 里面测试的话,zip 包删不掉,要是单独一个test 测试删除方法的话,zip 包是可以删除的。总结一下,在同一个线程里面 解压之后包删不掉。这肯定是资源在占用中。

      我在代码里面加了个垃圾回收(System.gc();),依然不行...

      我仍然不放弃,还是在 百度上找代码,看看别人有没有遇到这样的问题,我看了好多,也测试了好多代码,发现博客好多都是复制的,或许是其他人看了这个博客解决了问题,然后自己 不想总结,于是乎,就把 这个博客 复制到自己的 博客里,这虽然省事了,但毕竟不是自己的原创 ,我是一个支持原创的人。(虽然我可能也有复制过,但是我没有发布哇)。看了这么多  依然不行。突然我的扣扣亮了一下,老大发来一张图片。

        果然精辟呀,加上去之后E盘的文件真的消失了。。  

      困扰了我一上午的问题就这样解决了,真是应了我的那句话,"越是看上去很难奇怪的问题,越是最简单的问题."  "奇怪的问题",只是一个概念,只是存在我心里面的,所以这句话也只能是我跟我自己说。

       不说了,看代码吧.一共有两个类   PhotoTaskService.java 和  ZipUtil.java

    package com.hupu.smart.user.service.photoTask;
    
    import com.hupu.smart.user.domain.UserPhoto;
    import com.hupu.smart.user.interfaces.UserPhotoService;
    import com.hupu.smart.user.service.util.UploadImageUtil;
    import com.hupu.smart.user.service.util.ZipUtil;
    import org.slf4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Service;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by Wangjunnan on 2017/4/1.
     */
    @Service("photoTaskService")
    public class PhotoTaskService {
    
    
        @Value("#{configProperties['oss_endpoint_url']}")
        private  String ENDPOINT;
    
        @Value("#{configProperties['oss_access_id']}")
        private   String ACCESS_ID;
    
        @Value("#{configProperties['oss_access_key']}")
        private   String ACCESS_KEY;
    
        @Value("#{configProperties['oss_domain']}")
        private   String OSS_DOMAIN;
    
        @Value("#{configProperties['oss_bucket']}")
        private   String BUCKET;
    
        @Autowired
        private UserPhotoService photoService;
    
        private Logger log = org.slf4j.LoggerFactory.getLogger(PhotoTaskService.class);
    
        private String url="E:\image";
    
    
        // 检查是不是存在 zip 的 文件,并返回 这些文件
    
        @Scheduled(cron="0/10 * * * * ? ")
        public void   searchZipFile(){
            log.info("解压用户照片任务开始执行");
            List<File> list= new ArrayList<>();
            File file=new File(url);
            if (file.isDirectory()) {
                File[] files = file.listFiles();
                for (File f : files) {
                    if (f.getName().endsWith(".zip")) {  // zip文件  判断 是否存在
                       list.add(f);
    
                    }
                }
            }
            if(null !=list && list.size()>0){ // 如果有文件就解压 并保存
                releaseZipFile(list);
            }
            log.info("解压用户照片任务执行完毕");
            // 删除 解压后的文件
            deleteDir(new File(url));
        }
    
        //解压  zip文件  返回  List<userPhoto>
        public void  releaseZipFile(List<File> files){
            List<UserPhoto> photos=new ArrayList<>();
            try{
            for(File f:files){
                List<File> fileList = ZipUtil.upZipFile(f, url);
                delZipFile(); // 解压完成之后删除 zip 包
                for (int i=0;i<fileList.size();i++){
                    String  userId=fileList.get(i).getParentFile().getName();
                    // 上传
                    String photoUrl = UploadImageUtil.uploadPic(fileList.get(i), "photo", ENDPOINT, ACCESS_ID, ACCESS_KEY, BUCKET, OSS_DOMAIN);
                    log.info("用户图片上传成功");
                    // 封装成 user_photo 对象
                    UserPhoto photo=new UserPhoto();
                    photo.setUserId(userId);
                    photo.setPhotoPath(photoUrl);
                    photo.setState(0);
                    photo.setIsDel(0);
                    photos.add(photo);
                }
            }
            // 保存到数据库
            photoService.addUserPhoto(photos);
            log.info("数据已保存到数据库");
            }catch (Exception e){
                log.error("照片上传出错"+e.getMessage());
            }
        }
    
        // 删除zip 文件
        public  void delZipFile(){
            File file=new File(url);
            if (file.isDirectory()) {
                File[] files = file.listFiles();
                for (File f : files) {
                    if (f.getName().endsWith(".zip")) {  // zip文件  判断 是否存在
                      if(f.delete()) {
                          log.info("zip文件已经删除");
                      }else{
                          log.info("zip文件删除失败");
                      }
                    }
                }
            }
        }
         // 删除解压后的文件
        private  boolean deleteDir(File dir) {
    
        if (dir.isDirectory()) {
            String[] children = dir.list();
            //递归删除目录中的子目录下
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空,可以删除
        return dir.delete();
        }
    
    
    }
    

      

          ZipUtil.java

    package com.hupu.smart.user.service.util;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipFile;
    import org.slf4j.Logger;
    
    
    /**
     * 压缩或解压zip:
     * 由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类
     * @author Administrator
     */
    
    public class ZipUtil {
        private static byte[] _byte = new byte[1024] ;
    
        private static Logger log = org.slf4j.LoggerFactory.getLogger(ZipUtil.class);
    
        /**
         * 对.zip文件进行解压缩
         * @param zipFile  解压缩文件
         * @param descDir  压缩的目标地址,如:D:\测试 或 /mnt/d/测试
         * @return
         */
        public static List<File> upZipFile(File zipFile, String descDir) {
            List<File> _list = new ArrayList<>() ;
            try {
                ZipFile _zipFile = new ZipFile(zipFile , "GBK") ;
                for( Enumeration entries = _zipFile.getEntries() ; entries.hasMoreElements() ; ){
                    ZipEntry entry = (ZipEntry)entries.nextElement() ;
                    File _file = new File(descDir + File.separator + entry.getName()) ;
                    if( entry.isDirectory() ){
                        _file.mkdirs() ;
                    }else{
                        File _parent = _file.getParentFile() ;
                        if( !_parent.exists() ){
                            _parent.mkdirs() ;
                        }
                        InputStream _in = _zipFile.getInputStream(entry);
                        OutputStream _out = new FileOutputStream(_file) ;
                        int len ;
                        while( (len = _in.read(_byte)) > 0){
                            _out.write(_byte, 0, len);
                        }
                        if (null !=_out){
                            _out.flush();
                            _out.close();
                        }
                        if (null !=_in){
                            _in.close();
                        }
                        _list.add(_file);
                    }
                }
          // 加了这行代码之后就可以删除了 _zipFile.close();// 加了这行代码之后就可以删除了       // 加了这行代码之后就可以删除了
    } catch (IOException e) { log.error(e.getMessage()); } return _list ; } }

      

       然后用junit 测试一下就可以了

    @Test
    public void testPhoto(){
        taskService.searchZipFile();
    }
    

      

      

  • 相关阅读:
    scp 跨服务器传数据
    Mongo启动失败解决方案
    centos7 NET模式配置虚拟机
    centos7虚拟机配置桥接模式
    Linux centos7 查看cpu 磁盘 内存使用情况
    centos7修改时间和时区
    fiddler培训
    docker学习笔记
    docker-ce安装官翻
    Nginx+Tomcat简单负载均衡
  • 原文地址:https://www.cnblogs.com/murong/p/6674768.html
Copyright © 2020-2023  润新知