java创建临时文件的好处
1.保证文件被正确地清理和删除,避免了磁盘空间浪费和安全隐患
疑问部分
1.首先java的删除临时文件的时候是按照文件名倒叙删除的,但是要保证每一级的文件夹中为空的,但是我们,但是我们java在提供临时文件删除方法时,需要我们手动去调用这个方法才会删除临时文件,而不是自动删除
2.其次临时文件的删除方法是在虚拟机停止前调用,这也就是说如果我们的虚拟机一直处于启动状态,这些临时文件就无法删除,而且使用java提供的创建方式文件名后面会给我们补一个随机的码来确保不会重复创建问题,而且每个文件名是放入一个LinkedHashSet中来保证创建顺序与唯一性的,但是最终会放入一个arrlist中,下面放源码
public void deleteOnExit() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkDelete(path);
}
if (isInvalid()) {
return;
}
// 所有临时文件的删除都在下面这个类中执行
DeleteOnExitHook.add(path);
}
package java.io;
import java.util.*;
import java.io.File;
/**
- This class holds a set of filenames to be deleted on VM exit through a shutdown hook.
- A set is used both to prevent double-insertion of the same file as well as offer
- quick removal.
*/
class DeleteOnExitHook {
private static LinkedHashSet files = new LinkedHashSet<>();
static {
// DeleteOnExitHook must be the last shutdown hook to be invoked.
// Application shutdown hooks may add the first file to the
// delete on exit list and cause the DeleteOnExitHook to be
// registered during shutdown in progress. So set the
// registerShutdownInProgress parameter to true.
sun.misc.SharedSecrets.getJavaLangAccess()
.registerShutdownHook(2 /* Shutdown hook invocation order /,
true / register even if shutdown in progress */,
new Runnable() {
public void run() {
runHooks();
}
}
);
}
private DeleteOnExitHook() {}
static synchronized void add(String file) {
if(files == null) {
// DeleteOnExitHook is running. Too late to add a file
throw new IllegalStateException("Shutdown in progress");
}
files.add(file);
}
static void runHooks() {
LinkedHashSet<String> theFiles;
synchronized (DeleteOnExitHook.class) {
theFiles = files;
files = null;
}
ArrayList<String> toBeDeleted = new ArrayList<>(theFiles);
// reverse the list to maintain previous jdk deletion order.
// Last in first deleted.
Collections.reverse(toBeDeleted);
for (String filename : toBeDeleted) {
(new File(filename)).delete();
}
}
}
下面放创建代码
import java.io.File;
import java.io.IOException;
public class TempFileExample {
public static void main(String[] args) {
try {
// 在默认临时文件目录下创建临时文件
// temp为文件前缀
// .txt为文件后缀
// File.createTempFile的方法也可以传入第三个参数,
可以指定文件夹来创建new File("指定具体创建路径")
File tempFile = File.createTempFile("temp", ".txt");
// 输出临时文件的绝对路径
System.out.println("临时文件已创建,路径为" + tempFile.getAbsolutePath());
// 操作完毕后,删除临时文件
boolean deleted = tempFile.delete();
System.out.println("临时文件已删除:" + deleted);
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 标记 JVM 退出时,自动删除
file.deleteOnExit();
这个方法最终调用(new File(filename)).delete();方法,上面的源码写的很清楚了,而且在添加删除路径时添加方法上面加了synchronized 关键字 确保多线程情况下的线程安全问题