首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SCALA: monix Obeservable方法

SCALA: monix Obeservable方法
EN

Stack Overflow用户
提问于 2020-04-28 10:25:49
回答 1查看 107关注 0票数 0

我正在尝试使用Monix可观察到的方法将文件的大内存控制成更小的字节块,这样它就不会消耗太多的RAM来加载文件的字节。

但是,当我使用Observable.frominputStreram时,它没有提供从MessageDigest填充到update()函数中的Array[Byte]

对我的密码有什么建议吗?

代码语言:javascript
复制
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

    }
代码语言:javascript
复制
 def main(args: Array[String]): Unit = {
    val path = "C:\\Users\\ME\\IdeaProjects\\HELLO\\src\\main\\scala\\TRY.scala"
    println(SHA256_5(new File(path)))

  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-28 12:37:29

代码语言:javascript
复制
in.map(byteArray=>sha256.update(byteArray)).completed

返回Task --这意味着您必须执行该Task,当它完成时,您将能够调用

代码语言:javascript
复制
sha256.digest().map("%02x".format(_)).mkString

因为Task用于延迟构建异步操作。

试一试:

代码语言:javascript
复制
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中运行异步计算。

代码语言:javascript
复制
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
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61477971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档