本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
1.x 和 2.x 之间的流媒体操作差异 适用于 Java 的 AWS SDK
在 SDK 的 2.x 版本 I/O 中,流式传输操作(例如 Amazon S3 getObject 和putObject方法)支持非阻塞功能。因此,请求和响应模型对象不再获取 InputStream 作为参数。相反,对于异步请求,请求对象接受 RequestBody(这是一个字节流)。异步等效项接受 AsyncRequestBody。
例 1.x 中的亚马逊 S3 PutoBject 操作
s3client.putObject(BUCKET, KEY, new File(file_path));
例 2.x 中亚马逊 S3 的 PutoBject 操作
s3client.putObject(PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), RequestBody.of(Paths.get("myfile.in")));
在 V2 中,流式响应对象接受 ResponseTransformer(对于同步客户端)和 AsyncResponseTransformer(对于异步客户端)。
例 1.x 中亚马逊 S3 的 getObject 操作
S3Object o = s3.getObject(bucket, key); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key));
例 2.x 中亚马逊 S3 的 getObject 操作
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("key")));
在适用于 Java 的 SDK 2.x 中,流式响应操作使用 AsBytes 方法将响应加载到内存中,并简化了内存中的常见类型转换。
迁移串联的 GZIP 响应处理
从 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. }