我写的文件传输代码如下:
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实际上读取缓冲的文件,但在此之前文件已被删除。
我的简单假设是,java.io.File.delete等待文件在块读取完成后释放,但我从来没有听说过Java file类的这个过程,或者.fromFile()已经将所有行加载到枚举器实例中,但我认为这违反了fromCallBack()规范。
有人知道这个机制吗?
发布于 2013-04-25 11:43:08
我猜您使用的是某种Unix系统,例如OSX或Linux。
在Unix:y系统上,您实际上可以删除打开的文件,任何文件系统条目都只是指向实际文件的链接,打开文件时获得的文件句柄也是如此。在移除文件内容的最后一个链接之前,文件内容不会变成无法访问的/deleted。
所以:在执行file.delete之后,它将不再显示在文件系统中,但是您仍然可以使用在Enumerator.fromFile( InputStream )中创建的文件来读取它,因为它创建了一个文件句柄。(在Linux上,您实际上可以通过特殊的/proc文件系统找到它,其中包括每个运行进程的文件句柄)
在windows上我认为你会得到一个错误,所以如果它要在多个平台上运行,你可能也应该检查一下在windows上测试你的webapp。
https://stackoverflow.com/questions/16056827
复制