FS2流一直运行到InputStream的结尾

St.*_*rio 0 functional-programming scala scala-cats fs2

我是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
  }
}
Run Code Online (Sandbox Code Playgroud)

程序将打印第一个块。这是合理的。但是我想找到一种方法来“发出信号”在哪里停止阅读以及在哪里停止。我的意思是继续打电话read(is)直到结束。有办法实现吗?

我也尝试过,repeatEval(read(is)) 但它会一直读下去……我之间需要一些东西。

Jef*_*ung 5

使用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)
Run Code Online (Sandbox Code Playgroud)