【问题标题】:FS2 stream run till the end of InputStreamFS2 流一直运行到 InputStream 结束
【发布时间】:2018-05-25 02:28:43
【问题描述】:

我是 FS2 的新手,需要一些有关设计的帮助。我正在尝试设计一个流,它将从底层InputStream 中提取块直到它结束。这是我尝试过的:

import java.io.{File, FileInputStream, InputStream}

import cats.effect.IO
import cats.effect.IO._

object Fs2 {

  def main(args: Array[String]): Unit = {
    val is = new FileInputStream(new File("/tmp/my-file.mf"))
    val stream = fs2.Stream.eval(read(is))
    stream.compile.drain.unsafeRunSync()
  }

  def read(is: InputStream): IO[Array[Byte]] = IO {
    val buf = new Array[Byte](4096)
    is.read(buf)
    println(new String(buf))
    buf
  }
}

程序打印唯一的第一个块。这是合理的。但我想找到一种方法来“指示”在哪里停止阅读以及在哪里停止。我的意思是一直打电话到read(is) 直到结束。有没有办法做到这一点?

我也尝试过repeatEval(read(is)),但它一直在读取...我需要介于两者之间的东西。

【问题讨论】:

    标签: scala functional-programming scala-cats fs2


    【解决方案1】:

    使用fs2.io.readInputStreamfs2.io.readInputStreamAsync。前者阻塞当前线程;后者阻塞了ExecutionContext 中的一个线程。例如:

    val is: InputStream = new FileInputStream(new File("/tmp/my-file.mf"))
    val stream = fs2.io.readInputStreamAsync(IO(is), 128)
    

    【讨论】:

    • 酷,非常感谢。该实现让我了解了如何以自定义方式进行分块(我需要比块大小更复杂的块策略)。不幸的是,只能给 +1 一次 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多