java调用删除文件的方法删除文件,却删除不干净
场景:
程序中在做数据下载时,生成了一个临时文件夹。夹子里面有一些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(); } }