Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Unterschiede beim Streaming-Betrieb zwischen 1.x und 2.x des AWS SDK für Java
Streaming-Operationen wie Amazon S3 getObject und putObject Methods unterstützen die Nichtblockierung I/O in Version 2.x des SDK. Infolgedessen verwenden die Objekte des Anforderungs- und Antwortmodells kein A mehr InputStream als Parameter. Stattdessen akzeptiert das Anforderungsobjekt bei synchronen AnfragenRequestBody, was ein Bytestrom ist. Das asynchrone Äquivalent akzeptiert eine. AsyncRequestBody
Beispiel des Amazon S3 S3-PutObject-Betriebs in 1.x
s3client.putObject(BUCKET, KEY, new File(file_path));
Beispiel des Amazon S3 S3-PutObject-Betriebs in 2.x
s3client.putObject(PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), RequestBody.of(Paths.get("myfile.in")));
Ein Streaming-Antwortobjekt akzeptiert a ResponseTransformer für synchrone Clients und a AsyncResponseTransformer für asynchrone Clients in V2.
Beispiel des Amazon S3 S3-GetObject-Betriebs in 1.x
S3Object o = s3.getObject(bucket, key); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key));
Beispiel des Amazon S3 S3-GetObject-Betriebs in 2.x
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("key")));
Im SDK for Java 2.x verfügen Streaming-Antwortoperationen über eine AsBytes Methode, um die Antwort in den Speicher zu laden und gängige Typkonvertierungen im Speicher zu vereinfachen.
Migrieren Sie die Verarbeitung verketteter GZIP-Antworten
Aktualisieren Sie bei der Migration von SDK for Java 1.x manuell den Code, der einen S3-Antwortstream einschließt. GZIPInputStream Nehmen Sie diese Änderung vor, wenn die Antwort mehrere verkettete GZIP-Mitglieder enthalten kann. Wählen Sie ResponseTransformer.toGzipCompatibleInputStream() oder, für einen asynchronen Client,. AsyncResponseTransformer.toGzipCompatibleBlockingInputStream()
Beachten Sie bei der Migration dieses Codes Folgendes:
-
Das Migrationstool wählt diese Transformatoren nicht automatisch aus.
-
Bei einigen JDK-Versionen
GZIPInputStreamkönnen Sie nach einem Mitglied einer verketteten GZIP-Antwort aufhören. Dies kann passieren, wenn der nächste Netzwerkblock nicht eingetroffen ist. Das Ergebnis können ausnahmslos gekürzte dekomprimierte Daten sein. -
Diese Transformatoren dekomprimieren den Inhalt der Antwort nicht. Verwenden Sie sie nur, wenn Sie den zurückgegebenen Stream
GZIPInputStreameinschließen. Verwenden Sie andernfallsResponseTransformer.toInputStream()oderAsyncResponseTransformer.toBlockingInputStream().
Für einen synchronen Client:
ResponseInputStream<GetObjectResponse> response = s3Client.getObject( request, ResponseTransformer.toGzipCompatibleInputStream()); try (GZIPInputStream gzipInputStream = new GZIPInputStream(response)) { // Read the decompressed response. }
Sie können ResponseTransformer.toGzipCompatibleInputStream(Duration) es verwenden, um das Timeout für den ersten Lesevorgang zu konfigurieren.
Für einen asynchronen Client:
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. }