Kotlin中的多平台输入流替代方案?

Kotlin中的多平台输入流替代方案?,kotlin,inputstream,kotlin-multiplatform,Kotlin,Inputstream,Kotlin Multiplatform,我正在寻找输入流的多平台替代方案。我的具体任务是通过https从远程服务器获取加密文件,并按需解密 在JavaLand中,我将实现一个InputStream,它将读取代理到https库中的输入流。我如何在kotlin中针对多个平台执行相同的操作 我看到ktor返回一个,但我不知道是哪个函数 我迷路了,不知道从哪里开始。提前谢谢你的帮助 如果您使用的框架没有为您提供完善的InputStream实现,那么剩下的唯一机会就是编写自己的框架。很像ktor开发人员所做的:ByteReadChannel只是

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

在JavaLand中,我将实现一个
InputStream
,它将读取代理到https库中的输入流。我如何在kotlin中针对多个平台执行相同的操作

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


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

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

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

当然,您不必像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)
}
//共同点
接口文件获取程序{
fun fetch():序列
}
期待有趣的fileFetcher(来源:String):fileFetcher
//在jvm中
类JvmFileFetcher(val输入:java.io.InputStream):FileFetcher{
重写fun fetch():Sequence=input.readBytes().asSequence()
}
实际有趣的fileFetcher(来源:String):fileFetcher{
val input=java.net.URL(source.openStream())
返回JvmFileFetcher(输入)
}
您可以在公共部分中定义一个接口
FileFetcher
,以及一个工厂函数
FileFetcher
。通过在
fileFetcher
函数中使用
expect
关键字,您需要为您定义的所有目标平台提供特定于平台的实现。使用公共部分中的
FileFetcher
接口实现您的逻辑(解密文件内容等)。有关如何使用序列的信息,请参阅
序列的文档

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

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