View a markdown version of this page

の 1.x と 2.x のストリーミングオペレーションの違い AWS SDK for Java - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

の 1.x と 2.x のストリーミングオペレーションの違い AWS SDK for Java

Amazon S3 の getObject や putObject メソッドなどのストリーミングオペレーションは、 SDK のバージョン 2.x でノンブロッキング I/O をサポートしています。その結果、リクエストとレスポンスのモデルオブジェクトでは InputStream をパラメータとして使用しなくなりました。代わりに、同期リクエストのリクエストオブジェクトでは、バイト単位のストリームである RequestBody を受け付けるようになりました。非同期の場合は AsyncRequestBody を受け付けます。

例 1.x での Amazon S3 putObject オペレーション
s3client.putObject(BUCKET, KEY, new File(file_path));
例 2.x での Amazon S3 putObject オペレーション
s3client.putObject(PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), RequestBody.of(Paths.get("myfile.in")));

V2 では、ストリーミングレスポンスオブジェクトは同期クライアントで ResponseTransformer を受け付け、非同期クライアントで AsyncResponseTransformer を受け付けます。

例 1.x での Amazon S3 getObject オペレーション
S3Object o = s3.getObject(bucket, key); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key));
例 2.x での Amazon S3 getObject オペレーション
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("key")));

SDK for Java 2.x では、ストリーミングレスポンスオペレーションには、レスポンスをメモリにロードし、一般的なタイプのインメモリ変換を簡素化する AsBytes メソッドがあります。

連結された GZIP レスポンス処理の移行

SDK for Java 1.x から移行する場合は、 で S3 レスポンスストリームをラップするコードを手動で更新しますGZIPInputStream。レスポンスに複数の連結 GZIP メンバーを含めることができる場合は、この変更を加えます。非同期クライアントの場合は、 ResponseTransformer.toGzipCompatibleInputStream()または を選択しますAsyncResponseTransformer.toGzipCompatibleBlockingInputStream()。

このコードを移行するときは、次の点を考慮してください。

  • 移行ツールは、これらのトランスフォーマーを自動的に選択しません。

  • 一部の JDK バージョンでは、連結された GZIP レスポンスの 1 つのメンバーの後に を停止GZIPInputStreamできます。これは、次のネットワークチャンクが到着していない場合に発生する可能性があります。結果は、例外なしで解凍されたデータを切り捨てることができます。

  • これらのトランスフォーマーはレスポンスコンテンツを解凍しません。返されたストリームを でラップする場合にのみ使用します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. }