需求是这样的,  在服务器上有 运营上传的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 包并删除的更多相关文章

  1. Java 解压zip压缩包

    因为最近项目需要批量上传文件,而这里的批量就是将文件压缩在了一个zip包里,然后读取文件进行解析文件里的内容. 因此需要先对上传的zip包进行解压.以下直接提供代码供参考: 1.第一个方法是用于解压z ...

  2. redhat下安装mysql 5.6.20,解压zip包,查看已经安装过的mysql,卸载rpm安装包,安装mysqlserver端和client,改动mysqlusername,登陆mysql,启动关闭mysql

     1 将相关的mysql rpm包上传到redhat上 2  我的电脑是Redhat 6.*版本号.所以这里使用上面一个 3  解压zip包 4  安装下面几个rpm MySQL-client-a ...

  3. 如何通过python代码解压zip包

    转载至https://www.cnblogs.com/flyhigh1860/p/3884842.html 很多人在Google上不停的找合适自己的压缩,殊不知Py的压缩很不错.可以试试.当然C#,J ...

  4. JAVA解压ZIP文件

    import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inp ...

  5. mysql5.7.12直接解压zip包,安装过程

    MySQL-5.7.12-winx64.zip解压安装方式 1.解压文件到你想要安装的位置.     本人是直接解压到E盘. 2.配置环境变量,在path中放入:E:\mysql-5.7.12-win ...

  6. Java—解压zip文件

    import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import ja ...

  7. Java 解压 zip 文件

    代码如下 package test_java; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcep ...

  8. java解压zip压缩包

    package com.spring.mvc.zip; import java.io.File;import java.io.FileOutputStream;import java.io.Input ...

  9. Ubuntu解压zip包中文乱码

    解决方法:通过unar 工具解压 步骤一: 安装unar: sudo apt-get install unrar 步骤二: 解压(以test.zip为例):unar test.zip 解压成功,乱码问 ...

随机推荐

  1. Dockerfile详解

    Dockerfile详解 利用Dockerfile文件,可以构建docker的image镜像 命令使用 通过-f参数指定Dockerfile路径,进行构建image docker build -f / ...

  2. TempDB问题定位与解决

    步骤1.TempDB压力诊断 等待类型诊断 TempDB的争用压力在等待篇中已经简单介绍,等待的表现为 pagelatch_类等待,等待的资源是 “2: X :X ” tempDB所在磁盘的响应时间 ...

  3. SUN SERVER X3-2 服务器数据写入缓慢

    使用一台sun server x3-2,SAS 300G 2.5寸硬盘两块:8G内存条*2,CPU E5-2609V3 安装一套服务器系统时感觉安装进度很慢,但一直找不到原因,因为要重做系统,同事练手 ...

  4. 网络性能测试工具Iperf/Jperf解读

    Iperf 是一个网络性能测试工具.Iperf 可以测试TCP 和UDP 带宽质量.Iperf 可以测量最大TCP 带宽,具有多种参数和UDP 特性. Iperf 可以报告带宽,延时抖动和数据包丢失. ...

  5. github学习(一)

    初识github篇. 一.什么是github:       GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub.       g ...

  6. select函数的用法

    首先介绍阻塞方式与非阻塞方式: 阻塞方式(block),就是进程或是线程执行到这些函数时必须等待某个事件的发生.如果事件没有发生,进程或线程就被阻塞,函数不能立即返回. 非阻塞方式(non-block ...

  7. [BNUZOJ1261][ACM][2016北理校赛]方块消除(栈,字符串)

    玩过方块消除游戏吗?现在规定当有两个或两个以上相邻且颜色相同的方块在一起的时候,它们就会产生消除反应.当存在多个消除反应同时产生时,最下的反应先执行.现在只给你其中一列,求最后剩下的方块结果. 输入要 ...

  8. 关于mvc中传入DataTable到视图的应用

    MVC 中 如果是多表连接查询出的数据需要重新定义一个ViewModel,觉得很是麻烦,所以可以通过传一个DataTable到视图中可以避免这个问题 但是不知道会有什么不好的地方,有这方面经验的大神有 ...

  9. 初写Python

    #!/usr/bin/env python (指定用什么解释器运行脚本以及解释器所在的位置) # -*- coding:utf-8 -*- (用来指定文件编码为utf-8的)   # 无效的内容,只做 ...

  10. UI 设计模式 手势识别器

    1> target / action 设计模式 : target ['tɑːgɪt]         1>什么是耦合 : 耦合是衡量一个程序呢写的好坏的标准之一 耦合是衡量模块与模块之间关 ...