我正在尝试使用Monix可观察到的方法将文件的大内存控制成更小的字节块,这样它就不会消耗太多的RAM来加载文件的字节。
但是,当我使用Observable.frominputStreram时,它没有提供从MessageDigest填充到update()函数中的Array[Byte]。
对我的密码有什么建议吗?
def SHA256_5(file: File)= {
val sha256 = MessageDigest.getInstance("SHA-256")
val in: Observable[Array[Byte]] = {
Observable.fromInputStream(Task(new FileInputStream(file)))
}
in.map(byteArray=>sha256.update(byteArray)).completed
sha256.digest().map("%02x".format(_)).mkString
} def main(args: Array[String]): Unit = {
val path = "C:\\Users\\ME\\IdeaProjects\\HELLO\\src\\main\\scala\\TRY.scala"
println(SHA256_5(new File(path)))
}发布于 2020-04-28 12:37:29
in.map(byteArray=>sha256.update(byteArray)).completed返回Task --这意味着您必须执行该Task,当它完成时,您将能够调用
sha256.digest().map("%02x".format(_)).mkString因为Task用于延迟构建异步操作。
试一试:
def calcuateSHA(file: File) = for {
sha256 <- Task(MessageDigest.getInstance("SHA-256"))
in = Observable.fromInputStream(Task(new FileInputStream(file)))
_ <- in.map(byteArray=>sha256.update(byteArray)).completed
} yield sha256.digest().map("%02x".format(_)).mkString
def main(args: Array[String]): Unit = {
val path = "C:\\Users\\ME\\IdeaProjects\\HELLO\\src\\main\\scala\\TRY.scala"
import monix.execution.Implicits.global
Await.result(calcuateSHA(new File(path)).runToFuture, Duration.Inf)
}对于启动程序,或者如果您想使用Monix TaskApp中的构建来执行,而不是使用hack在同步main中运行异步计算。
object Test extends TaskApp {
def calcuateSHA(file: File) = for {
sha256 <- Task(MessageDigest.getInstance("SHA-256"))
in = Observable.fromInputStream(Task(new FileInputStream(file)))
_ <- in.map(byteArray=>sha256.update(byteArray)).completed
} yield sha256.digest().map("%02x".format(_)).mkString
def run(args: List[String]) = {
val path = "C:\\Users\\ME\\IdeaProjects\\HELLO\\src\\main\\scala\\TRY.scala"
for {
sha <- calcuateSHA(new File(path)
_ = println(sha)
} yield ExitCode.Success
}
}https://stackoverflow.com/questions/61477971
复制相似问题