View a markdown version of this page

流式操作 - AWS SDK for Kotlin

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

流式操作

在中 AWS SDK for Kotlin,二进制数据(流)表示为一种ByteStream类型,它是一个抽象的只读字节流。

流式响应

使用二进制流的响应(例如亚马逊简单存储服务 (Amazon S3) Simple GetObjectS3 API 操作)的处理方式与其他方法不同。这些方法采用一个 lambda 函数来处理响应,而不是直接返回响应。这限制了函数的响应范围,并简化了调用方和 SDK 运行时的生命周期管理。

lambda 函数返回后,任何资源(例如底层 HTTP 连接)都将被释放。(在 lambda 返回后ByteStream不应访问,也不应从闭包中传出。) 无论lambda返回什么,调用的结果都是如此。

以下代码示例显示了 getObject 函数接收处理响应的 lambda 参数。

val s3Client = S3Client.fromEnvironment() val req = GetObjectRequest { ... } val path = Paths.get("/tmp/download.txt") // S3Client.getObject has the following signature: // suspend fun <T> getObject(input: GetObjectRequest, block: suspend (GetObjectResponse) -> T): T val contentSize = s3Client.getObject(req) { resp -> // resp is valid until the end of the block. // Do not attempt to store or process the stream after the block returns. // resp.body is of type ByteStream. val rc = resp.body?.writeToFile(path) rc } println("wrote $contentSize bytes to $path")

ByteStream类型具有以下扩展名,用于常见的使用方式:

  • ByteStream.writeToFile(file: File): Long

  • ByteStream.writeToFile(path: Path): Long

  • ByteStream.toByteArray(): ByteArray

  • ByteStream.decodeToString(): String

所有这些都是在aws.smithy.kotlin.runtime.content软件包中定义的。

直播请求

为了提供 aByteStream,还有几种便捷方法,包括:

  • ByteStream.fromFile(file: File)

  • File.asByteStream(): ByteStream

  • Path.asByteStream(): ByteStream

  • ByteStream.fromBytes(bytes: ByteArray)

  • ByteStream.fromString(str: String)

所有这些都是在aws.smithy.kotlin.runtime.content软件包中定义的。

以下代码示例演示了在创建时使用提供 body 属性的ByteStream便捷方法 PutObjectRequest

val req = PutObjectRequest { ... body = ByteStream.fromFile(file) // body = ByteStream.fromBytes(byteArray) // body = ByteStream.fromString("string") // etc }