3

我写的文件传输代码如下:

val fileContent: Enumerator[Array[Byte]] = Enumerator.fromFile(file)
val size = file.length.toString
file.delete // (1) THE FILE IS TEMPORARY SO SHOULD BE DELETED 
SimpleResult(
 header = ResponseHeader(200, Map(CONTENT_LENGTH -> size, CONTENT_TYPE -> "application/pdf")),
 body = fileContent)

即使文件大小相当大(2.6 MB),此代码也能成功运行,但我很困惑,因为我对 .fromFile() 的理解是 fromCallBack() 的包装,而 SimpleResult 实际上读取了缓冲的文件,但文件是在此之前删除。

我的简单假设是 java.io.File.delete 等到块读取完成后文件被释放,但我从未听说过 Java File 类的过程,或者 .fromFile() 已经将所有行加载到 Enumerator例如,但我认为它违反了 fromCallBack() 规范。

有人知道这个机制吗?

4

1 回答 1

2

我猜你是在某种 Unix 系统上,例如 OSX 或 Linux。

在 Unix:y 系统上,您实际上可以删除打开的文件,任何文件系统条目都只是指向实际文件的链接,打开文件时获得的文件句柄也是如此。在删除最后一个指向它的链接之前,文件内容不会变得无法访问/删除。

因此:在您执行 file.delete 后,它将不再显示在文件系统中,但您仍然可以使用在 Enumerator.fromFile(file) 中创建的 InputStream 读取它,因为它创建了一个文件句柄。(在 Linux 上,您实际上可以通过特殊的 /proc 文件系统找到它,其中包含每个正在运行的进程的文件句柄)

在 Windows 上我认为你会得到一个错误,所以如果它要在多个平台上运行,你可能应该检查在 Windows 上测试你的 webapp。

于 2013-04-25T11:43:08.410 回答