本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
1.x 和 2.x 之間的串流操作差異 適用於 Java 的 AWS SDK
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")));
串流回應物件接受同步用戶端ResponseTransformer的 ,以及 V2 中非同步用戶端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")));
在適用於 Java 的 SDK 2.x 中,串流回應操作具有將回應載入記憶體AsBytes的方法,並簡化記憶體中的常見類型轉換。
遷移串連的 GZIP 回應處理
從適用於 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. }