scala - SCALA:monix 可观察方法
问题描述
我正在尝试使用 Monix Observable 将文件的大内存控制为更小的字节块,这样它就不会占用太多 RAM 来加载文件的字节。
Array[Byte]
但是,当我使用Observable.frominputStreram时,它不提供update()
从MessageDigest
.
对我的代码有什么建议吗?
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)))
}
解决方案
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
}
}
推荐阅读
- java - Java - 导出后复制目录不起作用
- java - 如何在使用 Apache POI 和 java 创建的 .docx 上添加页码
- hyperledger-fabric - 无法登录 Hyperledger 大提琴操作员仪表板
- netlogo - 我的经纪人生了太多孩子
- node.js - IBM Watson 对话客户端:子节点输出未显示在 Localhost 中
- odata - 如何使用 OData 模型获取项目表值?
- c# - 我正在从 C# Web 应用程序向 android 设备发送推送通知
- spring - Ignite 2.5.0 上的 TTL 不起作用
- algorithm - 如何在优化工作量和最小化出行距离的同时将任务分配给员工?
- azure-cognitive-search - 在天蓝色搜索中添加整数数据的查询