场景:

  程序中在做数据下载时,生成了一个临时文件夹。夹子里面有一些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();
    }
}

相关文章:

  • 2021-09-17
  • 2022-12-23
  • 2022-12-23
  • 2022-02-13
  • 2022-01-07
  • 2022-12-23
  • 2021-12-04
  • 2022-02-08
猜你喜欢
  • 2022-01-12
  • 2022-12-23
  • 2021-12-01
  • 2022-12-23
  • 2021-10-11
  • 2022-12-23
  • 2022-01-19
相关资源
相似解决方案