FS2:如何从 fs2.Stream 中获取 java.io.InputStream?
FS2: How to get a java.io.InputStream from a fs2.Stream?
假设我有 val fs2Stream: Stream[IO, Byte]
,我需要,例如,调用一些需要 java.io.InputStream
.
的 Java 库
我想我对 FS2 太陌生了,但我似乎找不到答案。我试过使用 fs2.io.toInputStream
和 fs2.io.readInputStream
但我不知道如何提供一些必需的参数。我已经搜索了全能的 Google 来寻找答案,但是 API 似乎已经发生了变化,因为大多数人上次都在寻找答案。
我怎样才能做类似下面的事情?
def myFunc(data: fs2.Stream[IO, Byte]): InputStream[Byte] = someMagicalFunction(data)
你可能想要这样的东西:
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,代码为 运行。
假设我有 val fs2Stream: Stream[IO, Byte]
,我需要,例如,调用一些需要 java.io.InputStream
.
我想我对 FS2 太陌生了,但我似乎找不到答案。我试过使用 fs2.io.toInputStream
和 fs2.io.readInputStream
但我不知道如何提供一些必需的参数。我已经搜索了全能的 Google 来寻找答案,但是 API 似乎已经发生了变化,因为大多数人上次都在寻找答案。
我怎样才能做类似下面的事情?
def myFunc(data: fs2.Stream[IO, Byte]): InputStream[Byte] = someMagicalFunction(data)
你可能想要这样的东西:
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,代码为 运行。