如何保证文件在自动一段时间后被删除?

时间:2017-04-18 23:18:32

标签: java delete-file temporary-files

我必须在用户上传图像几分钟后存储图像,直到用户确认并存储在数据库中

所以我想知道创建一个临时文件并用它来显示预览。

但是我必须确保如果用户不再进行交互,该文件将在一段时间后被删除

我发现这篇文章是关于临时文件以及如何自动删除它们https://softwarecave.org/2014/02/05/create-temporary-files-and-directories-using-java-nio2/

但如果我理解正确,deleteOnExit和ShutdownHook将在vm关闭后调用,所以如果我的应用程序长时间保持在线状态,那么这些文件永远不会被删除,DELETE_ON_EXIT选项会在我调用close方法时删除文件,所以如果我从不打电话因为用户不做任何事情,文件也永远不会被删除。那是对的吗?

那么..有没有办法保证文件会在一段时间后被删除?

我正在考虑使用deleteOnExit和DELETE_ON_CLOSE选项创建一个文件,并添加到一个带有“超时”的线程,并在此超时后检查文件是否仍然存在并删除,但我不知道是否存在最佳方法。

由于

更新

基于最佳答案,我开发了一个项目,以便在Kotlin的java.util.File写入时添加此行为。

https://github.com/vinicius-rob-cunha/kotlin-auto-delete-file

2 个答案:

答案 0 :(得分:2)

我不认为使用jmv关闭钩子的方法是可靠的,而且它似乎不是你想要的。我建议创建一个包含要安排删除的文件映射的类,并设置一个回调函数,以便在调用时推迟删除时间:

private Map<Path, ScheduledFuture> futures = new HashMap<>();

private ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());

private static final TimeUnit UNITS = TimeUnit.SECONDS; // your time unit

public void scheduleForDeletion(Path path, long delay) {
    ScheduledFuture future = executor.schedule(() -> {
        try {
            Files.delete(path);
        } catch (IOException e) {
            // failed to delete
        }
    }, delay, UNITS);

    futures.put(path, future);
}

public void onFileAccess(Path path) {
    ScheduledFuture future = futures.get(path);
    if (future != null) {

        boolean result = future.cancel(false);
        if (result) {
            // reschedule the task
            futures.remove(path);
            scheduleForDeletion(path, future.getDelay(UNITS));
        } else {
            // too late, task was already running
        }
    }
}

答案 1 :(得分:0)

您可以使用Timer()类。它基本上允许您指定具有一定延迟的Timer和TimerTask。延迟结束后,Timer会执行TimerTask并运行您的代码。您只需要为TimerTask programmaticaly设置文件路径。

这是Timer documentation.