

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 1.x 和 2.x 之間的串流操作差異 適用於 Java 的 AWS SDK
<a name="migration-streaming-ops"></a>

Amazon S3 `getObject`和 `putObject`方法等串流操作支援 SDK 2.x 版中的非封鎖 I/O。因此，請求和回應模型物件不再以 `InputStream`做為參數。相反地，對於同步請求，請求物件接受 `RequestBody`，這是位元組串流。非同步對等項目接受 `AsyncRequestBody`。

**Example 1.x 中的 Amazon S3 `putObject`操作**  

```
s3client.putObject(BUCKET, KEY, new File(file_path));
```

**Example 2.x 中的 Amazon S3 `putObject`操作**  

```
s3client.putObject(PutObjectRequest.builder()
                                 .bucket(BUCKET)
                                 .key(KEY)
                                 .build(),
                 RequestBody.of(Paths.get("myfile.in")));
```

串流回應物件接受同步用戶端`ResponseTransformer`的 ，以及 V2 中非同步用戶端`AsyncResponseTransformer`的 。

**Example 1.x 中的 Amazon S3 `getObject`操作**  

```
S3Object o = s3.getObject(bucket, key);
S3ObjectInputStream s3is = o.getObjectContent();
FileOutputStream fos = new FileOutputStream(new File(key));
```

**Example 2.x 中的 Amazon S3 `getObject`操作**  

```
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(),
		ResponseTransformer.toFile(Paths.get("key")));
```

在適用於 Java 的 SDK 2.x 中，串流回應操作具有將回應載入記憶體`AsBytes`的方法，並簡化記憶體中的常見類型轉換。

## 遷移串連的 GZIP 回應處理
<a name="migration-streaming-gzip"></a>

從適用於 Java 的 SDK 1.x 遷移時，請手動更新在 中包裝 S3 回應串流的程式碼。 `GZIPInputStream`如果回應可以包含多個串連的 GZIP 成員，請進行此變更。針對非同步用戶端選取 `ResponseTransformer.toGzipCompatibleInputStream()`或 `AsyncResponseTransformer.toGzipCompatibleBlockingInputStream()`。

當您遷移此程式碼時，請考慮下列事項：
+ 遷移工具不會自動選取這些轉換器。
+ 在某些 JDK 版本上，您的 `GZIPInputStream`可以在串連 GZIP 回應的一個成員之後停止。如果下一個網路區塊尚未送達，就可能發生這種情況。結果可以截斷解壓縮的資料，沒有例外。
+ 這些轉換器不會解壓縮回應內容。只有當您在 中包裝傳回的串流時，才使用它們`GZIPInputStream`。否則，請使用 `ResponseTransformer.toInputStream()`或 `AsyncResponseTransformer.toBlockingInputStream()`。

對於同步用戶端：

```
ResponseInputStream<GetObjectResponse> response =
    s3Client.getObject(
        request,
        ResponseTransformer.toGzipCompatibleInputStream());

try (GZIPInputStream gzipInputStream = new GZIPInputStream(response)) {
    // Read the decompressed response.
}
```

您可以使用 `ResponseTransformer.toGzipCompatibleInputStream(Duration)` 設定第一個讀取操作的逾時。

對於非同步用戶端：

```
CompletableFuture<ResponseInputStream<GetObjectResponse>> responseFuture =
    s3AsyncClient.getObject(
        request,
        AsyncResponseTransformer.toGzipCompatibleBlockingInputStream());

try (ResponseInputStream<GetObjectResponse> response = responseFuture.join();
     GZIPInputStream gzipInputStream = new GZIPInputStream(response)) {
    // Read the decompressed response. Reads block the calling thread.
}
```