场景:

  程序中在做数据下载时,生成了一个临时文件夹。夹子里面有一些txt和其他格式文件。

数据下载完毕后,需要删除这个临时文件夹,但是一直删除不干净,总会有一下文件残留。

  网搜到了这个问题的原因:

  内容来自:u012102536的博客

  原文地址:http://blog.csdn.net/u012102536/article/details/53583455

 原因:
  临时文件对象在java虚拟机(jvm)中还未被解除引用,虽然看似没有变量指向这个临时文件对象了,但还没来得急被垃圾收集器自动回收解除引用。
  因为jvm还占用着临时文件对象,所以删除不能成功。
 
 
解决方案:
  1)确保针对文件操作的数据流全部关闭了。
  2)可以延时若干秒后对文件进行删除。防止jvm还占用着临时文件对象。
 
代码:
import java.io.File;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; /**
* 文件删除工具类
*/
public class FileDeleteUtil { // 文件删除任务的线程池
private static ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); /**
* 延迟若干秒后执行删除操作
* @param file
* @param seconds
*/
public static void deleteDirAfterNSeconds(File file, int seconds) {
scheduledThreadPool.schedule(new Runnable() {
public void run() {
try {
if (file.exists()) {
// 两种删除方式都用上
deleteDir(file);
deleteDirByCmd(file);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}, seconds, TimeUnit.SECONDS);
} /**
* 通过调用系统命令删除一个文件夹及下面的所有文件
*/
public static void deleteDirByCmd(File file) {
// 文件不存在直接返回
if (null == file || !file.exists()) {
return;
} // 文件存在时执行删除操作
Runtime rt = Runtime.getRuntime();
try {
String cmd = null;
if (file.isFile()) {
cmd = "cmd.exe /c del /q/a/f/s " + file.getAbsolutePath();
} else {
cmd = "cmd.exe /c rd /s/q " + file.getAbsolutePath();
}
rt.exec(cmd);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 递归删除目录下的所有文件及子目录下所有文件
* @param dir 将要删除的文件目录|文件
*/
public static 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();
}
}

java调用删除文件的方法删除文件,却删除不干净的更多相关文章

  1. JAVA调用C语言写的SO文件

    JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...

  2. java调用dll或so动态库文件(c++/c)

    java调用dll或so动态库文件(c++/c) 博客分类:  工作 CC#C++JavaEclipse  java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CD ...

  3. java 调用webservice的各种方法总结

    java 调用webservice的各种方法总结 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 方法一:创建基于JAX-WS的webservice(包括 ...

  4. C#/Java 调用WSDL接口及方法

    一.C#利用vs里面自带的“添加web引用”功能: 1.首先需要清楚WSDL的引用地址  如:http://www.webxml.com.cn/Webservices/WeatherWebServic ...

  5. 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

    接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...

  6. linux下java调用.so动态库方法2: JNA

    摘自:http://blog.csdn.net/todorovchen/article/details/21319033 另请参见: http://blog.sina.com.cn/s/blog_8c ...

  7. java调用C++ DLL库方法

    最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java ...

  8. mysql中删除binlog的方法?mysql中如何删除binlog?

    需求描述: 在mysql中如何删除binlog,因为随着数据库的运行,mysql中产生的binlog会越来越大,有可能把磁盘撑爆了,所以记录下删除 binlog的方法. 操作过程: 1.通过系统参数控 ...

  9. 18-10-15 服务器删除数据的方法【Elasticsearch 数据删除 (delete_by_query 插件安装使用)】方法二没有成功

    rpa 都是5.xx  ueba 分为2.0 或者5.0 上海吴工删除数据的方法 在许多项目中,用户提供的数据存储盘大小有限,在运行一段时间后,大小不够就需要删除历史的 Elasticsearch 数 ...

  10. JAVA 调用exe程序执行对应的文件 (个人用于编译Java文件)

    需求: 需要利用Java程序,来调用计算机本身的黑窗口,来将特定的Java文件编译成对应的字节码文件. 实现思路: 通过调用Java的Runtime类,每个 Java 应用程序都有一个 Runtime ...

随机推荐

  1. Qt 4.8.2.+VS2008静态编译

    一.下载Qt 4.8.2-opensource. 二.解压到C:\Qt\4.8.2_static 修改C:\Qt\4.8.2_static\projects.pro文件,删除demos,doc,exa ...

  2. Tidis单机部署

    拉取镜像 docker pull yongman/tidis:latest docker pull pingcap/tikv docker pull pingcap/pd 运行pd,由于Raft算法3 ...

  3. JSP_tomcat_mysql_注冊验证用户;

    本文出自:http://blog.csdn.net/svitter 资源下载: github: git clone https://github.com/Svtter/JSP-tomcat-mysql ...

  4. PostgreSQL学习手册(角色和权限)

    原文地址:http://www.cnblogs.com/stephen-liu74/archive/2012/05/18/2302639.html PostgreSQL是通过角色来管理数据库访问权限的 ...

  5. 好好的P2P,咋说爆就爆?

    P2P 理财就是通过互联网理财,即个人对个人,又称点对点网络借贷 ,是指以公司为中介机构,把借贷双方对接起来实现各自的借贷需求.借款方可以是无抵押贷款或是有抵押贷款,而中介一般是收取双方或单方的手续费 ...

  6. Knockout.Js官网学习(Mapping高级用法二)

    使用ignore忽略不需要map的属性 如果在map的时候,你想忽略一些属性,你可以使用ignore累声明需要忽略的属性名称集合: " }; var mapping = { 'ignore' ...

  7. LINUX 修改SSH默认22端口的方法

    首先修改配置文件 vi /etc/ssh/sshd_config 找到#Port 22一段,这里是标识默认使用22端口,修改为如下: Port 22 Port 50000 然后保存退出 执行/etc/ ...

  8. 微信出现BUG,发送“ 两位数字+15个句号 ”,双方系统会卡崩……

    刚刚,有网友反映称,微信出现了新的bug.例如,在微信中发“两位数字+15个句号”(另一说法是任意数字,任意15个标点符号),如果有华为手机或者安卓手机收到,就会卡死. 用安卓手机的朋友可以试一下,不 ...

  9. 微软BI 之SSIS 系列 - 在 SSIS 输出平面文件时根据运行日期生成不同的文件名称

    开篇介绍 在 SSIS 中操作文件的输入和输出是非常方便的,这个例子讲解一个最简单的需求:比如每天从数据库中查询一批数据要输出到文件,每天产生一个文件,那么文件的名称按照"文件名+日期&qu ...

  10. MongoDB 进程控制系列一:查看当前正在执行的进程

    1:查看MongoDB当前正在做哪些操作? db.currentOp() 等同于: db.$cmd.sys.inprog.findOne() 2:查看当前有多少个连接? db.serverStatus ...