Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候删除Java临时文件?_Java_Garbage Collection_Temporary Files - Fatal编程技术网

什么时候删除Java临时文件?

什么时候删除Java临时文件?,java,garbage-collection,temporary-files,Java,Garbage Collection,Temporary Files,假设我使用该方法在Java中创建一个临时文件 File tmp = File.createTempFile(prefix, suffix); 如果我不明确地调用delete()方法,文件将在何时删除 直觉上,可能是JVM终止时,或者更早(由垃圾收集器终止),或者更晚(由某个操作系统扫描进程终止) 如果我不明确地调用delete()方法,文件将在何时删除 它不会,至少Java不会。如果希望在JVM终止时删除该文件,则需要调用tmp。deleteOnExit()临时文件用于存储不太重要的临时数据,

假设我使用该方法在Java中创建一个临时文件

File tmp = File.createTempFile(prefix, suffix);
如果我不明确地调用
delete()
方法,文件将在何时删除

直觉上,可能是JVM终止时,或者更早(由垃圾收集器终止),或者更晚(由某个操作系统扫描进程终止)

如果我不明确地调用
delete()
方法,文件将在何时删除


它不会,至少Java不会。如果希望在JVM终止时删除该文件,则需要调用
tmp。deleteOnExit()

临时文件用于存储不太重要的临时数据,在系统终止时应始终删除这些数据。最佳做法是使用文件.deleteOnExit()来执行此操作

比如说,

File temp = File.createTempFile("abc", ".tmp"); 
temp.deleteOnExit();
File temp = File.createTempFile("abc", ".tmp"); 
temp.deleteOnExit();

上面的示例将创建一个名为“abc.tmp”的临时文件,并在程序终止或退出时将其删除。

如果需要,您可以在终止进程之前手动删除该文件,但当进程终止时,该文件也将被删除。

来自:


临时文件用于存储不太重要的临时数据, 当您的系统终止时,应始终将其删除。这个 最佳做法是使用文件.deleteOnExit()来执行此操作

比如说,

File temp = File.createTempFile("abc", ".tmp"); 
temp.deleteOnExit();
File temp = File.createTempFile("abc", ".tmp"); 
temp.deleteOnExit();
上面的示例将创建一个名为“abc.tmp”的临时文件,并在程序终止或退出时将其删除


如果要手动删除临时文件,您仍然可以使用file.delete()。

该文件不会自动从以下位置删除:

此方法仅提供临时文件工具的一部分。到 安排自动删除使用此方法创建的文件, 使用deleteOnExit()方法

因此,您必须显式调用:

请求使用此抽象路径名表示的文件或目录 将在虚拟机终止时删除


正如其他答案所指出的,除非您明确请求,否则使用创建的临时文件不会自动删除

通用的、可移植的方法是调用
File
对象,该对象将在JVM终止时计划删除该文件。然而,这种方法的一个轻微缺点是,它只在VM正常终止时才起作用;在异常终止(即VM崩溃或VM进程的强制终止)时,文件可能保持未删除状态

在Unixish系统(如Linux)上,实际上可以通过在打开临时文件后立即删除它来获得更可靠的解决方案。这是因为Unix文件系统允许在一个或多个进程保持打开状态时删除文件(确切地说)。这些文件可以通过打开的文件句柄正常访问,它们在磁盘上占用的空间只有在持有文件打开句柄的最后一个进程退出后,操作系统才会回收

因此,以下是我所知道的最可靠和可移植的方法,以确保在程序退出后正确删除临时文件:

导入java.io.File;
导入java.io.RandomAccessFile;
导入java.io.IOException;
公共类TempFileTest
{
公共静态void main(字符串[]args)
{
试一试{
//创建一个临时文件
File temp=File.createTempFile(“tempfiletest”,“.tmp”);
字符串路径=temp.getAbsolutePath();
System.err.println(“创建的临时文件:“+path”);
//打开它的把手
RandomAccessFile fh=新的RandomAccessFile(临时,“rw”);
System.err.println(“为随机访问而打开的临时文件”);
//尝试立即删除该文件
布尔删除=假;
试一试{
删除=临时删除();
}捕获(安全异常e){
//忽略
}
//否则在程序结束时删除该文件
如果(已删除){
System.err.println(“临时文件已删除”);
}否则{
temp.deleteOnExit();
System.err.println(“计划删除的临时文件”);
}
试一试{
//测试将数据写入文件
String str=“一只敏捷的棕色狐狸跳过了懒狗。”;
fh.writeUTF(str);
System.err.println(“写入:+str”);
//测试从文件中读回数据
fh.seek(0);
String out=fh.readUTF();
System.err.println(“读取:+out”);
}最后{
//关闭文件
fh.close();
System.err.println(“临时文件关闭”);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
在Unixish系统上,运行此命令应产生如下输出:

Temp文件创建:/tmp/tempfiletest587200103465311579.tmp
临时文件为随机访问打开。
临时文件已删除。
写道:一只敏捷的棕色狐狸跳过了懒狗。
阅读:一只敏捷的棕色狐狸跳过了那只懒狗。
临时文件已关闭。
而在Windows上,输出看起来略有不同:

创建的临时文件:C:\DOCUME~1\User\LOCALS~1\Temp\tempfiletest5547070005699628548.tmp 临时文件为随机访问打开。 计划删除的临时文件。 写道:一只敏捷的棕色狐狸跳过了懒狗。 阅读:一只敏捷的棕色狐狸跳过了那只懒狗。 临时文件已关闭。 但是,在任何一种情况下,程序结束后,临时文件都不应保留在磁盘上


Ps.在Windows上测试这段代码时,我发现了一个相当令人惊讶的事实:显然,仅仅保持临时文件不关闭就足以防止它被删除。当然,这也意味着在使用临时文件时发生的任何崩溃都会导致临时文件崩溃