Implemente ContentStreamProvider no AWS SDK for Java 2.x - AWS SDK for Java 2.x

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Implemente ContentStreamProvider no AWS SDK for Java 2.x

ContentStreamProvideré uma abstração usada no AWS SDK for Java 2.x para permitir várias leituras dos dados de entrada. Este tópico explica como implementar um ContentStreamProvider corretamente para seus aplicativos.

O SDK for Java 2.x usa ContentStreamProvider#newStream() o método sempre que precisa ler um stream inteiro. Para que isso funcione em todo o fluxo, o fluxo retornado deve estar sempre no início do conteúdo e conter os mesmos dados.

Nas seções a seguir, fornecemos três abordagens sobre como implementar esse comportamento corretamente.

Utilizar mark() e reset()

No exemplo abaixo, usamos mark(int) no construtor antes do início da leitura para garantir que possamos redefinir o fluxo de volta ao início. Para cada invocação de, newStream() redefinimos o fluxo:

public class MyContentStreamProvider implements ContentStreamProvider { private InputStream contentStream; public MyContentStreamProvider(InputStream contentStream) { this.contentStream = contentStream; this.contentStream.mark(MAX_LEN); } @Override public InputStream newStream() { contentStream.reset(); return contentStream; } }

Use o buffer se mark() e não reset() estiverem disponíveis

Se seu stream não suportar mark() e reset() diretamente, você ainda poderá usar a solução mostrada anteriormente, primeiro agrupando o stream em umBufferedInputStream:

public class MyContentStreamProvider implements ContentStreamProvider { private BufferedReader contentStream; public MyContentStreamProvider(InputStream contentStream) { this.contentStream = new BufferedInputStream(contentStream); this.contentStream.mark(MAX_LEN); } @Override public InputStream newStream() { contentStream.reset(); return contentStream; } }

Crie novos streams

Uma abordagem mais simples é simplesmente obter um novo fluxo para seus dados em cada invocação e fechar o anterior:

public class MyContentStreamProvider implements ContentStreamProvider { private InputStream contentStream; @Override public InputStream newStream() { if (contentStream != null) { contentStream.close(); } contentStream = openStream(); return contentStream; } }