

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Operazioni di streaming
<a name="streaming-ops"></a>

In AWS SDK per Kotlin, i dati binari (flussi) sono rappresentati come 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, che è un flusso astratto di byte di sola lettura.

## Streaming delle risposte
<a name="streaming-responses"></a>

Le risposte con un flusso binario (come l'operazione API Amazon Simple Storage Service (Amazon [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)S3)) vengono gestite in modo diverso dagli altri metodi. Questi metodi utilizzano una funzione lambda che gestisce la risposta anziché restituirla direttamente. Ciò limita l'ambito della risposta alla funzione e semplifica la gestione della durata sia per il chiamante che per il runtime dell'SDK.

Dopo il ritorno della funzione lambda, tutte le risorse come la connessione HTTP sottostante vengono rilasciate. (Non è `ByteStream` necessario accedervi dopo il ritorno di lambda e non deve essere passato fuori dalla chiusura.) Il risultato della chiamata è qualunque cosa restituisca la lambda.

Il seguente esempio di codice mostra la funzione [getObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/-s3-client/get-object.html) che riceve un parametro lambda, che gestisce la risposta.

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

Il `ByteStream` tipo ha le seguenti estensioni per i modi più comuni di consumarlo:
+ `ByteStream.writeToFile(file: File): Long`
+ `ByteStream.writeToFile(path: Path): Long`
+ `ByteStream.toByteArray(): ByteArray`
+ `ByteStream.decodeToString(): String`

Tutti questi sono definiti nel `aws.smithy.kotlin.runtime.content` pacchetto.

## Richieste di streaming
<a name="streaming-requests"></a>

Per fornire un`ByteStream`, esistono anche diversi metodi di praticità, tra cui i seguenti:
+ `ByteStream.fromFile(file: File)`
+ `File.asByteStream(): ByteStream`
+ `Path.asByteStream(): ByteStream`
+ `ByteStream.fromBytes(bytes: ByteArray)`
+ `ByteStream.fromString(str: String)`

Tutti questi sono definiti nel `aws.smithy.kotlin.runtime.content` pacchetto.

Il seguente esempio di codice mostra l'uso di metodi `ByteStream` pratici che forniscono la proprietà body nella creazione di 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
}
```