

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

# 1.x 和 2.x 之间的流媒体操作差异 适用于 Java 的 AWS SDK
<a name="migration-streaming-ops"></a>

在 SDK 的 2.x 版本 I/O 中，流式传输操作（例如 Amazon S3 `getObject` 和`putObject`方法）支持非阻塞功能。因此，请求和响应模型对象不再获取 `InputStream` 作为参数。相反，对于异步请求，请求对象接受 `RequestBody`（这是一个字节流）。异步等效项接受 `AsyncRequestBody`。

**Example 1.x 中的亚马逊 S3 `PutoBject` 操作**  

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

**Example 2.x 中亚马逊 S3 的 `PutoBject` 操作**  

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

在 V2 中，流式响应对象接受 `ResponseTransformer`（对于同步客户端）和 `AsyncResponseTransformer`（对于异步客户端）。

**Example 1.x 中亚马逊 S3 的 `getObject` 操作**  

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

**Example 2.x 中亚马逊 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>

从 SDK for Java 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.
}
```