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 suas aplicações.

O SDK para Java 2.x usa o método ContentStreamProvider#newStream() sempre que precisa ler um fluxo inteiro. Para que isso funcione em todo o fluxo, o fluxo que retornar 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 reset() não estiverem disponíveis

Se o fluxo não comportar mark() e reset() diretamente, você ainda poderá usar a solução mostrada anteriormente, primeiro agrupando o fluxo em um BufferedInputStream:

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; } }

Criar fluxos

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; } }