gpt4 book ai didi

scala - 为什么此代码与 Enumerator.fromFile 一起成功运行?

转载 作者:行者123 更新时间:2023-12-02 02:03:37 25 4
gpt4 key购买 nike

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

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 等到 block 读取完成后文件被释放,但我从未听说过 Java File 类的这个过程,或者 .fromFile() 已经将所有行加载到 Enumerator 实例,但我认为这违反了 fromCallBack() 规范。

有人知道这个机制吗?

最佳答案

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

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

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

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

关于scala - 为什么此代码与 Enumerator.fromFile 一起成功运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com