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