首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这段代码能在Enumerator.fromFile上成功运行?

为什么这段代码能在Enumerator.fromFile上成功运行?
EN

Stack Overflow用户
提问于 2013-04-17 17:47:30
回答 1查看 174关注 0票数 3

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

代码语言:javascript
运行
复制
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()规范。

有人知道这个机制吗?

EN

回答 1

Stack Overflow用户

发布于 2013-04-25 19:43:08

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16056827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档