如何保证文件会在一段时间后自动删除?
How guarantee the file will be deleted after automatically some time?
我必须在用户上传图片后将其存储几分钟,直到用户确认并将其存储在数据库中
所以我想创建一个临时文件并用它来显示预览。
但我必须确保如果用户不再交互,该文件将在一段时间后被删除
我找到了这篇关于临时文件以及如何自动删除它们的文章https://softwarecave.org/2014/02/05/create-temporary-files-and-directories-using-java-nio2/
但如果我理解正确,deleteOnExit 和 ShutdownHook 将在 vm 关闭后调用,所以如果我的应用程序长时间保持在线,谢谢,这些文件永远不会被删除,并且 DELETE_ON_EXIT 选项将在我调用时删除文件close 方法,所以如果我从不调用 cause user don't do nothing,该文件也永远不会被删除。是吗?
所以..有什么办法保证文件会在一段时间后自动删除?
我想用 deleteOnExit 和 DELETE_ON_CLOSE 选项创建一个文件,并用 "timeout" 添加到一个线程,超时后检查文件是否仍然存在并删除,但我不知道'知道是否存在最佳方法。
谢谢
更新
根据最佳答案,我开发了一个项目以在 java.util.File
上使用 Kotlin 编写添加此行为。
https://github.com/vinicius-rob-cunha/kotlin-auto-delete-file
您可以使用 Timer() class。它基本上允许您指定一个具有一定延迟的定时器和一个 TimerTask。定时器在延迟时间结束后执行 TimerTask 并运行您的代码。您只需以编程方式设置 TimerTask 的文件路径。
我认为使用 jmv 关闭挂钩的方法不可靠,而且它似乎不是您要找的。我建议创建一个 class,其中包含您要安排删除的文件映射,并有一个回调,允许在调用时推迟删除时间:
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
}
}
}
我必须在用户上传图片后将其存储几分钟,直到用户确认并将其存储在数据库中
所以我想创建一个临时文件并用它来显示预览。
但我必须确保如果用户不再交互,该文件将在一段时间后被删除
我找到了这篇关于临时文件以及如何自动删除它们的文章https://softwarecave.org/2014/02/05/create-temporary-files-and-directories-using-java-nio2/
但如果我理解正确,deleteOnExit 和 ShutdownHook 将在 vm 关闭后调用,所以如果我的应用程序长时间保持在线,谢谢,这些文件永远不会被删除,并且 DELETE_ON_EXIT 选项将在我调用时删除文件close 方法,所以如果我从不调用 cause user don't do nothing,该文件也永远不会被删除。是吗?
所以..有什么办法保证文件会在一段时间后自动删除?
我想用 deleteOnExit 和 DELETE_ON_CLOSE 选项创建一个文件,并用 "timeout" 添加到一个线程,超时后检查文件是否仍然存在并删除,但我不知道'知道是否存在最佳方法。
谢谢
更新
根据最佳答案,我开发了一个项目以在 java.util.File
上使用 Kotlin 编写添加此行为。
https://github.com/vinicius-rob-cunha/kotlin-auto-delete-file
您可以使用 Timer() class。它基本上允许您指定一个具有一定延迟的定时器和一个 TimerTask。定时器在延迟时间结束后执行 TimerTask 并运行您的代码。您只需以编程方式设置 TimerTask 的文件路径。
我认为使用 jmv 关闭挂钩的方法不可靠,而且它似乎不是您要找的。我建议创建一个 class,其中包含您要安排删除的文件映射,并有一个回调,允许在调用时推迟删除时间:
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
}
}
}