我试图弄清楚如何确保在方法返回时删除在方法中创建的临时文件。我试过了file.deleteOnExit();
,但那是在程序停止时,而不是方法。我还尝试了try
和finally
块。使用finally
块是实现此目的的唯一方法吗?
public String example(File file) {
// do some random processing to the file here
file.canWrite();
InputStream() is = new FileInputStread(file);
// when we are ready to return, use the try finally block
try {
return file.getName();
} finally {
is.close();
file.delete();
}
}
我觉得它看起来很难看。有人有建议吗?
答案 0 :(得分:3)
那就是finally
的用途。
当然,在Java 7中,您可以编写一个AutoCloseable
实现,为您执行删除操作,并使用try-with-resources代替。
答案 1 :(得分:2)
如果您使用的是Java 7,则可以使用java.lang.AutoCloseable接口实现此目的。详情请http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html。
如果没有,那么最终是关闭/清理资源的最佳和广泛使用的方法。
答案 2 :(得分:2)
正如@BackSlash在您的具体情况中提到的那样,您可以在返回之前删除文件:
file.delete();
return "File processed!";
但是通常情况下,如果try块中的代码可以抛出异常,那么你的方法看起来很好。您也可以使用面向方面编程(例如使用AspectJ),但在您的情况下看起来有点过分。
您还可以使用Java 7的新功能来改进您的代码。Closable
的每个实例都将在try
块的末尾关闭,例如:
try (
InputStream in = ...
) {
// read from input stream.
}
// that's it. You do not have to close in. It will be closed automatically since InputStream implements Closable.
因此,您可以创建包装AutoDeletableFile
并实现File
的类Closable
。 close()
方法应删除该文件。在此代码中,您的工作方式与您的完全相同:
try (
AutoDeletableFile file = new AutoDeletableFile("myfile.txt");
) {
// deal with file
}
// do nothing here. The file will be deleted automatically since its close() method actually deletes the file.
答案 3 :(得分:0)
也许尝试删除方法末尾的文件(最后一行)?如果我理解正确,这将在方法退出之前删除文件吗?
File file = new File("file.txt");
file.delete();