

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

# 流式操作
<a name="streaming-ops"></a>

在中 适用于 Kotlin 的 AWS SDK，二进制数据（流）表示为一种[https://docs.aws.amazon.com/smithy-kotlin/api/latest/runtime-core/aws.smithy.kotlin.runtime.content/-byte-stream/index.html](https://docs.aws.amazon.com/smithy-kotlin/api/latest/runtime-core/aws.smithy.kotlin.runtime.content/-byte-stream/index.html)类型，它是一个抽象的只读字节流。

## 流式响应
<a name="streaming-responses"></a>

使用二进制流的响应（例如亚马逊简单存储服务 (Amazon S3) Simple [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)S3 API 操作）的处理方式与其他方法不同。这些方法采用一个 lambda 函数来处理响应，而不是直接返回响应。这限制了函数的响应范围，并简化了调用方和 SDK 运行时的生命周期管理。

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

以下代码示例显示了 [getObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/-s3-client/get-object.html) 函数接收处理响应的 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`软件包中定义的。

## 直播请求
<a name="streaming-requests"></a>

为了提供 a`ByteStream`，还有几种便捷方法，包括：
+ `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](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3.model/-put-object-request/index.html)：

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