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

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