SCALA: monix наблюдаемый метод - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь использовать Monix Observable для управления большой памятью файла на меньшие куски байтов, чтобы он не занимал слишком много ОЗУ для загрузки байтов файла.

Однако, когда я использую Observable.frominputStreram, он не предоставляет Array[Byte], который заполняет функцию 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)))

  }

1 Ответ

1 голос
/ 28 апреля 2020
in.map(byteArray=>sha256.update(byteArray)).completed

возвращает Task - это означает, что вы должны выполнить эти Task и по окончании , вы сможете вызвать

sha256.digest().map("%02x".format(_)).mkString

, поскольку задача используется для ленивого построения асинхронной операции.

Попробуйте вместо этого:

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 вместо хаков для выполнения асинхронных вычислений в синхронном 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...