+-
Scala.IO.File 将Array[Byte]转换为java.io.File。

我有一个 Array[Byte]该项目最初是在 pdf 格式。我需要把它转换为 java.io.File. 更新。 我有一个电子邮件服务,它可以发送带有附件(文件)的电子邮件。文件必须是在 java.io.File 格式。但在我的服务请求中的文件是以 Array[Byte]base64 编码。我不能每次都创建文件,因为会堵塞我的内存。

2
投票

java.io.File 并不是文件内容的存储,而只是文件在存储上的地址--如果API不让你以其他方式传递内容,你就必须使用临时文件,没有其他选择。

最多,你可以确保它们在使用后被删除。

用以下方法创建它们 /tmp 使用 File.createTempFile 记为 deleteOnExit 如果当前程序失败,或者 召唤 delete 关于 filefinally 阻止

如果你使用的是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。