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();
}

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM