7

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

在 Java 领域,我将使用一个实现InputStream代理读取来自 https 库的输入流。如何在针对多个平台的 kotlin 中做同样的事情。

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

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

4

1 回答 1

4

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

在 Kotlin 多平台项目的上下文中进行这项工作的关键是,需要在平台特定部分中提供实际实现。ktor 项目的 JVM 特定代码实际上有一个使用InputStream:的实现InputStream.toByteReadChannel

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

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

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

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

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

于 2018-11-25T15:14:09.740 回答