St.Antario
St.Antario

Reputation: 27375

FS2 stream run till the end of InputStream

I'm very new to FS2 and need some help about the desing. I'm trying to design a stream which will pull the chunks from the underlying InputStream till it's over. Here is what I tried:

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

And the program prints the only first chunk. This is reasonable. But I want to find a way to "signal" where to stop reading and where to not stop. I mean keep calling read(is) till its end. Is there a way to achieve that?

I also tried repeatEval(read(is)) but it keeps reading forever... I need something in between.

Upvotes: 2

Views: 2052

Answers (1)

Jeffrey Chung
Jeffrey Chung

Reputation: 19497

Use fs2.io.readInputStream or fs2.io.readInputStreamAsync. The former blocks the current thread; the latter blocks a thread in the ExecutionContext. For example:

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

Upvotes: 5

Related Questions