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

Java 如何保证文件在一段时间后自动删除?,java,delete-file,temporary-files,Java,Delete File,Temporary Files,我必须在用户上传图像后将其存储几分钟,直到用户确认并将其存储在数据库中 所以我想创建一个临时文件并用它来显示预览 但我必须确保,该文件将被删除一段时间后,如果用户不再互动 我找到了这篇关于临时文件以及如何自动删除它们的文章 但是如果我理解正确,deleteOnExit和ShutdownHook将在vm关闭后调用,因此如果我的应用程序长时间在线,谢谢,这些文件永远不会被删除,并且在我调用close方法时DELETE\u ON\u EXIT选项将删除文件,因此如果我永远不会调用cause user

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

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

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

我找到了这篇关于临时文件以及如何自动删除它们的文章

但是如果我理解正确,deleteOnExit和ShutdownHook将在vm关闭后调用,因此如果我的应用程序长时间在线,谢谢,这些文件永远不会被删除,并且在我调用close方法时DELETE\u ON\u EXIT选项将删除文件,因此如果我永远不会调用cause user dont do,文件也永远不会被删除。是吗

所以。。有没有办法保证文件会在一段时间后自动删除

我想用deleteOnExit和DELETE\u ON\u CLOSE选项创建一个文件,并用“timeout”添加到一个线程中,在这个超时之后检查文件是否仍然存在并删除,但我不知道是否存在最好的方法

谢谢

更新

基于最佳答案,我开发了一个项目,将此行为添加到
java.util.File
write-in-Kotlin中

您可以使用Timer()类。它基本上允许您指定具有特定延迟的计时器和TimerTask。计时器在延迟结束后执行TimerTask并运行代码。您只需设置TimerTask程序的文件路径即可


这里是

我不认为使用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
        }
    }
}
private-Map-futures=new-HashMap();
private ScheduledExecutorService executor=Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());
专用静态最终时间单位=TimeUnit.SECONDS;//你的时间单位
public void schedulefordelement(路径,长延迟){
ScheduledFuture future=执行者。计划(()->{
试一试{
删除(路径);
}捕获(IOE异常){
//删除失败
}
},延迟,单位);
期货。看跌期权(路径,未来);
}
公共void onFileAccess(路径){
ScheduledFuture future=futures.get(路径);
如果(未来!=null){
布尔结果=未来。取消(false);
如果(结果){
//重新安排任务
移除(路径);
schedulefordelement(路径,future.getDelay(单位));
}否则{
//太晚了,任务已在运行
}
}
}

我非常喜欢这种方法,我不知道这些执行者。只有一个问题,似乎计时器也起作用,但它们之间有什么区别?@Viniciuschunha查看描述Tanks的答案和解释,我将在SingleThread中使用它,因为我只需要删除文件。getDelay返回重新安排的时间,因此,此重新安排不起作用谢谢,根据您的回答,我在Kotlin中开发了一个项目,将此功能添加到
java.util.File
中。您正确地使用了Timer()是更好的选项,请参考,但它仅在可读性方面更好,并且实现了cancel()。无论如何,谢谢你的评论。