如何替换阻塞代码以在 Kotlin 中读取字节

Posted

技术标签:

【中文标题】如何替换阻塞代码以在 Kotlin 中读取字节【英文标题】:How to replace blocking code for reading bytes in Kotlin 【发布时间】:2019-10-25 06:34:03 【问题描述】:

我有 ktor 应用程序,它需要来自 multipart 的文件,代码如下:

multipart.forEachPart  part ->
  when (part) 
    is PartData.FileItem -> 
      image = part.streamProvider().readAllBytes()
    
    else -> // irrelevant
  
    

Intellij IDEA 将 readAllBytes() 标记为不适当的阻塞调用,因为 ktor 在协程之上运行。如何将此阻塞调用替换为适当的调用?

【问题讨论】:

【参考方案1】:

考虑到 Ktor 作为非阻塞、暂停 IO 框架的声誉,我很惊讶 FileItem 显然除了阻塞 InputStream API 来检索它之外别无他物。鉴于此,您唯一的选择似乎是委托给 IO 调度程序:

image = withContext(Dispatchers.IO)  part.streamProvider().readBytes() 

【讨论】:

以上是关于如何替换阻塞代码以在 Kotlin 中读取字节的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kotlin 中同时运行阻塞 Java 代码?

如何在 Picasso 上启用 TLS v 1.2 以在 Kotlin 中使用 https 加载图像

如何使用 COMMTIMEOUTS 等待字节可用但读取多个字节?

是否合法写入并集中的字节数组并从int读取以在MISRA C中转换值?

字节面试题: Kotlin 中处理生产者/消费者问题的 N 种方式?

Kotlin 多平台:如何在没有 runBlocking 的情况下以阻塞方式启动协程