【发布时间】:2014-11-01 03:03:20
【问题描述】:
Play 框架有 play.api.libs.Files.TemporaryFile,它持有对 File 的引用,并在 TemporaryFile#finalize() 中删除它。
case class TemporaryFile(file: File) {
def clean(): Boolean = {
file.delete()
}
def moveTo(to: File, replace: Boolean = false) {
Files.moveFile(file, to, replace = replace)
}
override def finalize {
clean()
}
}
我知道这有一些问题,例如,您可以填满整个磁盘而 JVM 感觉不需要 GC。
但这里我问的是程序的“正确性”,即没有磁盘空间限制的程序。
def foo() {
val tempFile = TemporaryFile(new File("/tmp/foo"))
val inputStream = new FileInputStream(tempFile.file) // last use
try {
println(inputStream.read())
} finally {
inputStream.close()
}
}
在我从文件中读取之前可以删除 /foo/bar 吗?我在// last use之后不使用tempFile,那之后可以马上定稿吗?
或者如果它作为参数传递给函数呢?
def foo() {
val tempFile = TemporaryFile(new File("/tmp/foo"))
bar(tempFile)
}
def bar(tempFile: TemporaryFile) {
val inputStream = new FileInputStream(tempFile.file) // last use
try {
println(inputStream.read())
} finally {
inputStream.close()
}
}
如果在上面的示例中,tempFile 可能在我使用完毕之前被删除,TemporaryFile 的正确用法是什么,这样就不会发生这种情况?
【问题讨论】:
-
请注意,读取文件和
File实例之间没有任何关系,除了用于标识文件系统资源的名称。 -
@SotiriosDelimanolis,正确。
-
好问题。并且没有一个答案解决了在已经收集了 TemporaryFile 对象的情况下处理异步 Future 块中的
File引用时可能发生的问题......我怀疑这会在我的应用程序上产生一个错误!
标签: java scala garbage-collection playframework-2.3