java 解压 zip 包并删除
Posted 慕容哲别--
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(); }
以上是关于java 解压 zip 包并删除的主要内容,如果未能解决你的问题,请参考以下文章
如何解决java.util.zip.ZipException