+-
我有一个 Array[Byte]
该项目最初是在 pdf
格式。我需要把它转换为 java.io.File
. 更新。 我有一个电子邮件服务,它可以发送带有附件(文件)的电子邮件。文件必须是在 java.io.File
格式。但在我的服务请求中的文件是以 Array[Byte]
与 base64
编码。我不能每次都创建文件,因为会堵塞我的内存。
2
投票
投票
java.io.File
并不是文件内容的存储,而只是文件在存储上的地址--如果API不让你以其他方式传递内容,你就必须使用临时文件,没有其他选择。
最多,你可以确保它们在使用后被删除。
用以下方法创建它们/tmp
使用
File.createTempFile
记为
deleteOnExit
如果当前程序失败,或者 召唤
delete
关于
file
在
finally
阻止
如果你使用的是Cats Effect,就可以做这样的事情。
val withTempFile = Resource.make[F, File] {
F.delay(File.createTempFile)
} { file =>
F.delay(file.delete)
}
withTempFile.use { file =>
// operation in F
}
如果你用的是普通的Scala,贷款模式就可以了。
def withTempFile(thunk: File => A): A = {
val tmpFile = File.createTempFile
try {
thunk(tmpFile)
} finally {
tmpFile.delete
}
}
withTempFile { file =>
// operation
}
一旦你有了一个几乎可以肯定会被删除的临时文件 你就可以写到它,然后把文件引用传递给你的服务。
如果你想避免使用磁盘上的临时文件,如果有可能的话,你可以考虑像RAM磁盘这样的东西。底线是--如果API不允许你使用 Array[Byte]
并且只接受 File
你 不得不 在磁盘上写入这个文件。或者找一个不同的服务商API。