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

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

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

但是我必须确定,如果用户不再互动,文件会在一段时间后被删除

我发现这篇文章关于临时文件,以及如何自动删除它们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选项创建一个文件,并添加到“超时”的线程,并在此超时后检查文件是否仍然存在和删除,但我不知道是否存在最好的办法。

谢谢

UPDATE

基于最好的答案,我开发一个项目,把这个行为添加到Kotlin的java.util.File中。

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

我不认为使用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 } } } 

你可以使用Timer()类。 它基本上允许你指定一个具有一定延迟的Timer和一个TimerTask。 计时器在延迟启动并执行代码后执行TimerTask。 你只需要设置TimerTask programmaticaly的文件路径。

这里是定时器文件。

Interesting Posts