

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Operações de streaming
<a name="streaming-ops"></a>

No AWS SDK para Kotlin, os dados binários (fluxos) são representados como um [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)tipo, que é um fluxo abstrato de bytes somente para leitura.

## Respostas de streaming
<a name="streaming-responses"></a>

As respostas com um stream binário (como a operação de API do Amazon Simple Storage Service (Amazon [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)S3)) são tratadas de forma diferente de outros métodos. Esses métodos usam uma função lambda que manipula a resposta em vez de retorná-la diretamente. Isso limita o escopo da resposta à função e simplifica o gerenciamento da vida útil do chamador e do tempo de execução do SDK.

Depois que a função lambda retorna, todos os recursos, como a conexão HTTP subjacente, são liberados. (Eles não `ByteStream` devem ser acessados após o retorno do lambda e não devem ser retirados do fechamento.) O resultado da chamada é o que o lambda retorna.

O exemplo de código a seguir mostra a função [getObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/-s3-client/get-object.html) recebendo um parâmetro lambda, que manipula a resposta.

```
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")
```

O `ByteStream` tipo tem as seguintes extensões para formas comuns de consumi-lo:
+ `ByteStream.writeToFile(file: File): Long`
+ `ByteStream.writeToFile(path: Path): Long`
+ `ByteStream.toByteArray(): ByteArray`
+ `ByteStream.decodeToString(): String`

Tudo isso está definido no `aws.smithy.kotlin.runtime.content` pacote.

## Solicitações de streaming
<a name="streaming-requests"></a>

Para fornecer um`ByteStream`, também existem vários métodos de conveniência, incluindo os seguintes:
+ `ByteStream.fromFile(file: File)`
+ `File.asByteStream(): ByteStream`
+ `Path.asByteStream(): ByteStream`
+ `ByteStream.fromBytes(bytes: ByteArray)`
+ `ByteStream.fromString(str: String)`

Tudo isso está definido no `aws.smithy.kotlin.runtime.content` pacote.

O exemplo de código a seguir mostra o uso de métodos de `ByteStream` conveniência que fornecem a propriedade body na criação de um [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
}
```