Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么此代码可以成功地与Enumerator.fromFile一起工作?_Scala_Playframework_Playframework 2.0 - Fatal编程技术网

Scala 为什么此代码可以成功地与Enumerator.fromFile一起工作?

Scala 为什么此代码可以成功地与Enumerator.fromFile一起工作?,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我编写了如下文件传输代码: 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 -> siz

我编写了如下文件传输代码:

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.6MB),此代码也能成功运行, 但我感到困惑,因为我对.fromFile()的理解是fromCallBack()的包装,SimpleResult实际上读取文件buffred,但在此之前该文件已被删除

我简单的假设是java.io.File.delete会在区块读取完成后等待文件被释放,但我从未听说过java File类的这个过程, 或者.fromFile()已经将所有行加载到枚举器实例,但我认为这违反了fromCallBack()规范


有人知道这个机制吗

我猜您使用的是某种Unix系统,例如OSX或Linux

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

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

但在windows上,我认为您会遇到一个错误,所以如果它要在多个平台上运行,您可能也应该检查并在windows上测试您的webapp