

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

# 将基于 Java 的 S3 异步客户端配置为使用并行传输
<a name="s3-async-client-multipart"></a>

从版本 2.27.5 开始，基于 Java 的标准 S3 异步客户端支持自动并行传输（分段上传和下载）。在创建基于 Java 的 S3 异步客户端时，您可以配置对并行传输的支持。

本节介绍如何启用并行传输以及如何自定义配置。

## 创建 `S3AsyncClient` 的实例
<a name="s3-async-client-multipart-create"></a>

当您不在[生成器](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClientBuilder.html)上调用任何 `multipart*` 方法的情况下创建 `S3AsyncClient` 实例时，不会启用并行传输。以下每条语句都创建一个基于 Java 的 S3 异步客户端，不支持分段上传和下载。

### 在*没有*分段支持的情况下创建
<a name="s3-async-client-mp-off"></a>

**Example**  

```
import software.amazon.awssdk.auth.credentials.ProcessCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3AsyncClient;


S3AsyncClient s3Client = S3AsyncClient.create();

S3AsyncClient s3Client2 = S3AsyncClient.builder().build();

S3AsyncClient s3Client3 = S3AsyncClient.builder()
        .credentialsProvider(ProcessCredentialsProvider.builder().build())
        .region(Region.EU_NORTH_1)
        .build();
```

### 在*有*分段支持的情况下创建
<a name="s3-async-client-mp-on"></a>

要使用默认设置启用并行传输，请在生成器上调用 `multipartEnabled` 并传入 `true`，如下例所示。

**Example**  

```
S3AsyncClient s3AsyncClient2 = S3AsyncClient.builder()
        .multipartEnabled(true)
        .build();
```

`thresholdInBytes` 和 `minimumPartSizeInBytes` 设置的默认值为 8 MiB。

如果您自定义分段设置，则会自动启用并行传输，如下所示。

**Example**  

```
import software.amazon.awssdk.services.s3.S3AsyncClient;
import static software.amazon.awssdk.transfer.s3.SizeConstant.MB;


S3AsyncClient s3AsyncClient2 = S3AsyncClient.builder()
        .multipartConfiguration(b -> b
                .thresholdInBytes(16 * MB)
                .minimumPartSizeInBytes(10 * MB))
        .build();
```

## 上传未知大小的流
<a name="java-async-client-stream-unknown-size"></a>

启用了分段功能的基于 Java 的 S3 异步客户端可以有效地处理事先不知道总大小的输入流：

```
public PutObjectResponse asyncClient_multipart_stream_unknown_size(String bucketName, String key, InputStream inputStream) {

    S3AsyncClient s3AsyncClient = S3AsyncClient.builder().multipartEnabled(true).build();
    ExecutorService executor = Executors.newSingleThreadExecutor();
    AsyncRequestBody body = AsyncRequestBody.fromInputStream(inputStream, null, executor); // 'null' indicates that the
                                                                                           // content length is unknown.
    CompletableFuture<PutObjectResponse> responseFuture =
            s3AsyncClient.putObject(r -> r.bucket(bucketName).key(key), body)
                    .exceptionally(e -> {
                        if (e != null) {
                            logger.error(e.getMessage(), e);
                        }
                        return null;
                    });

    PutObjectResponse response = responseFuture.join(); // Wait for the response.
    executor.shutdown();
    return response;
}
```

这种方法可以防止手动指定错误的内容长度时可能出现的问题，例如对象截断或上传失败。