Kotlin 中的多平台 InputStream 替代方案?

wol*_*yst 5 inputstream kotlin kotlin-multiplatform

我正在寻找输入流的多平台替代方案。我的具体任务是通过 https 从远程服务器获取加密文件并按需解密。

在 Java 领域,我会使用一个工具InputStream来代理从 https 库读取输入流。我如何在面向多个平台的 kotlin 中做同样的事情。

我看到 ktor 返回一个ByteReadChannel,但我不知道哪些函数。

我迷路了,不知道从哪里开始。提前感谢您的帮助。

Bri*_*ian 8

如果您使用的框架没有为您提供成熟的InputStream实现,那么剩下的唯一机会就是编写您自己的框架。就像 ktor 开发人员所做的那样:ByteReadChannel只是“从通道读取字节”的抽象。这种抽象存在于公共部分中,并允许围绕它编写应用程序和业务逻辑。

在 Kotlin 多平台项目的上下文中实现此功能的关键是,需要在平台特定部分中提供实际实现。ktor 项目的 JVM 特定代码实际上有一个使用以下代码的实现InputStreamInputStream.toByteReadChannel

您当然不必像 ktor 项目中的示例那样对从字节通道到文件表示的所有内容进行建模。如果您想利用 Kotlin 框架类,序列可能会很方便。这可能看起来像这样:

// in common
interface FileFetcher {
  fun fetch(): Sequence<Byte>
}

expect fun fileFetcher(source: String): FileFetcher

// in jvm
class JvmFileFetcher(val input: java.io.InputStream): FileFetcher {
  override fun fetch(): Sequence<Byte> = input.readBytes().asSequence()
}

actual fun fileFetcher(source: String): FileFetcher {
  val input = java.net.URL(source).openStream()
  return JvmFileFetcher(input)
}
Run Code Online (Sandbox Code Playgroud)

您可以在公共部分中定义一个接口FileFetcher和一个工厂函数。fileFetcher通过在函数expect上使用关键字,fileFetcher您需要为您定义的所有目标平台提供特定于平台的实现。使用FileFetcher公共部分中的接口来实现您的逻辑(解密文件内容等)。Sequence有关如何使用它的信息,请参阅文档。

然后为所有平台实现工厂函数并actual在它们上使用关键字。然后,您将需要编写特定于平台的FileFetcher. 我的示例展示了如何使用 JVM 版本的FileFetcher接口。

这个例子当然是非常基本的,你可能不想完全像这样做(我猜至少需要一些缓冲)。此外,在 JVM 部分中,您还可以轻松地利用您最喜欢的网络/HTTP 库。