FS2:如何从fs2.Stream获取java.io.InputStream?

问题描述 投票:0回答:1

说我有val fs2Stream: Stream[IO, Byte],例如,我需要调用一些需要java.io.InputStream的Java库。

我想我对FS2不太了解,但是我似乎找不到答案。我尝试使用fs2.io.toInputStreamfs2.io.readInputStream,但无法弄清楚如何提供一些必需的参数。我已经在全能的Google上搜索了答案,但是自从大多数人最后一次寻找答案以来,API似乎已经发生了变化。

我该如何执行以下操作?

def myFunc(data: fs2.Stream[IO, Byte]): InputStream[Byte] = someMagicalFunction(data)
scala stream fs2 http4s
1个回答
1
投票

您可能想要这样的东西:

import cats.effect.{ContextShift, IO, Resource}
import java.io.InputStream

def myFunc(data: fs2.Stream[IO, Byte])
          (implicit cs: ContextShift[IO]): Resource[IO, InputStream] =
  data.through(fs2.io.toInputStream).compile.resource.lastOrError

然后您可以像这样使用它:

object JavaApi {
  def foo(is: InputStream): IO[Unit] = ???
}

object Main extends IOApp {
  def data: fs2.Stream[IO, Byte] = ???

  override def run(args: List[String]): IO[ExitCode] =
    myFunc(data).use(JavaApi.foo).as(ExitCode.Success)
}

这里是正在运行代码的Scastie

© www.soinside.com 2019 - 2024. All rights reserved.