gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:53:56 26 4
gpt4 key购买 nike

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

在Java领域,我会实现一个InputStream,它代理从https库对输入流的读取。我怎样才能在针对多个平台的 kotlin 中做同样的事情。

我看到 ktor 返回 ByteReadChannel ,但不知道有哪些功能。

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

最佳答案

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

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

您当然不必像 ktor 项目中的示例那样对从字节 channel 到文件表示的所有内容进行建模。如果您想利用 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)
}

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

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

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

关于kotlin - Kotlin 中的多平台输入流替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53014347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com