首页 > 解决方案 > 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)))

  }

标签: scala

解决方案


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
  }
}

推荐阅读