java立刻删除临时文件_什么时候删除Java临时文件?

本文介绍了一种在Java中创建和管理临时文件的可靠方法,并详细解释了如何在不同操作系统(如Unix和Windows)上处理临时文件,以确保即使在程序异常终止时也能正确删除。

Ilmari Karon..

50

至于其他的答案注意到,与创建的临时文件File.createTempFile()会不会被自动除非你明确要求它删除.

通用,可移植的方法来做到这一点是调用.deleteOnExit()上File的对象,这将安排文件删除当JVM终止.然而,这种方法的一个小缺点是它只能在VM正常终止时起作用; 在异常终止(即VM崩溃或VM进程强制终止)时,该文件可能仍未删除.

在Unixish系统(例如Linux)上,通过在打开临时文件后立即删除临时文件,实际上可以获得更可靠的解决方案.这是有效的,因为Unix文件系统允许在一个或多个进程仍然保持打开的情况下删除文件(取消链接,准确无误).这些文件可以通过打开的文件句柄正常访问,并且它们在磁盘上占用的空间只有在持有文件的打开句柄的最后一个进程退出后才由OS回收.

所以这是我所知道的最可靠和最便携的方法,以确保在程序退出后正确删除临时文件:

import java.io.File;

import java.io.RandomAccessFile;

import java.io.IOException;

public class TempFileTest

{

public static void main(String[] args)

{

try {

// create a temp file

File temp = File.createTempFile("tempfiletest", ".tmp");

String path = temp.getAbsolutePath();

System.err.println("Temp file created: " + path);

// open a handle to it

RandomAccessFile fh = new RandomAccessFile (temp, "rw");

System.err.println("Temp file opened for random access.");

// try to delete the file immediately

boolean deleted = false;

try {

deleted = temp.delete();

} catch (SecurityException e) {

// ignore

}

// else delete the file when the program ends

if (deleted) {

System.err.println("Temp file deleted.");

} else {

temp.deleteOnExit();

System.err.println("Temp file scheduled for deletion.");

}

try {

// test writing data to the file

String str = "A quick brown fox jumps over the lazy dog.";

fh.writeUTF(str);

System.err.println("Wrote: " + str);

// test reading the data back from the file

fh.seek(0);

String out = fh.readUTF();

System.err.println("Read: " + out);

} finally {

// close the file

fh.close();

System.err.println("Temp file closed.");

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

在Unixish系统上,运行它应该产生类似于以下输出:

Temp file created: /tmp/tempfiletest587200103465311579.tmp

Temp file opened for random access.

Temp file deleted.

Wrote: A quick brown fox jumps over the lazy dog.

Read: A quick brown fox jumps over the lazy dog.

Temp file closed.

而在Windows上,输出看起来略有不同:

Temp file created: C:\DOCUME~1\User\LOCALS~1\Temp\tempfiletest5547070005699628548.tmp

Temp file opened for random access.

Temp file scheduled for deletion.

Wrote: A quick brown fox jumps over the lazy dog.

Read: A quick brown fox jumps over the lazy dog.

Temp file closed.

但是,在任何一种情况下,程序结束后临时文件都不应保留在磁盘上.

PS.在Windows上测试这段代码时,我发现了一个相当令人惊讶的事实:显然,仅仅保留临时文件未被封闭就足以防止它被删除.当然,这也意味着临时文件正在使用时发生的任何崩溃都会导致它被取消删除,这正是我们在这里要避免的.

AFAIK,避免这种情况的唯一方法是确保使用块始终关闭临时文件finally.当然,你也可以删除同一个finally块中的文件.我不确定使用什么,如果有的话,.deleteOnExit()实际上会让你获益.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值