1

我试图弄清楚如何确保在方法返回时删除在方法中创建的临时文件。我试过file.deleteOnExit();了,但那是程序停止的时候,而不是方法。我也试过一个tryfinally块。使用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();
    }
}

我觉得它看起来很丑。有人有建议吗?

4

4 回答 4

4

正如@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. 
于 2013-08-28T13:49:05.067 回答
3

嗯,这就是finally它的用途。

当然,在 Java7 中,您可以编写一个AutoCloseable为您执行删除操作的实现,并改用 try-with-resources。

于 2013-08-28T13:41:51.960 回答
2

如果您使用的是 Java 7,则可以使用 java.lang.AutoCloseable 接口来实现这一点。此处有详细信息http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

如果不是,那么 finally 是关闭/清理资源的最佳且广泛使用的方法。

于 2013-08-28T13:44:45.267 回答
0

也许尝试在方法末尾(最后一行)删除文件?如果我理解正确,这将在方法退出之前删除文件?

File file = new File("file.txt");
file.delete();
于 2013-08-28T13:50:18.563 回答