

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Operaciones de streaming
<a name="streaming-ops"></a>

En el AWS SDK para Kotlin, los datos binarios (flujos) se representan como un [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 es un flujo abstracto de bytes de solo lectura.

## Respuestas de transmisión
<a name="streaming-responses"></a>

Las respuestas con un flujo binario (como la operación de la API Amazon Simple Storage Service (Amazon [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)S3)) se gestionan de forma diferente a la de otros métodos. Estos métodos utilizan una función lambda que gestiona la respuesta en lugar de devolverla directamente. Esto limita el alcance de la respuesta a la función y simplifica la administración del ciclo de vida tanto de la persona que llama como del entorno de ejecución del SDK.

Cuando se devuelve la función lambda, se liberan todos los recursos, como la conexión HTTP subyacente. (No se `ByteStream` debe acceder a él después de que la lambda regrese y no se debe desconectar del cierre). El resultado de la llamada es lo que devuelva la lambda.

El siguiente ejemplo de código muestra que la función [GetObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/-s3-client/get-object.html) recibe un parámetro lambda, que gestiona la respuesta.

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

El `ByteStream` tipo tiene las siguientes extensiones para las formas habituales de consumirlo:
+ `ByteStream.writeToFile(file: File): Long`
+ `ByteStream.writeToFile(path: Path): Long`
+ `ByteStream.toByteArray(): ByteArray`
+ `ByteStream.decodeToString(): String`

Todas ellas están definidas en el `aws.smithy.kotlin.runtime.content` paquete.

## Solicitudes de streaming
<a name="streaming-requests"></a>

Para suministrar un`ByteStream`, también hay varios métodos prácticos, incluidos los siguientes:
+ `ByteStream.fromFile(file: File)`
+ `File.asByteStream(): ByteStream`
+ `Path.asByteStream(): ByteStream`
+ `ByteStream.fromBytes(bytes: ByteArray)`
+ `ByteStream.fromString(str: String)`

Todos ellos están definidos en el `aws.smithy.kotlin.runtime.content` paquete.

El siguiente ejemplo de código muestra el uso de métodos `ByteStream` prácticos que proporcionan la propiedad body en la creación de un [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
}
```