Usando Guava CountingOutputStream
1. Visão geral
Neste tutorial, vamos dar uma olhada na classeCountingOutputStream e como usá-la.
A classe pode ser encontrada em bibliotecas populares comoApache Commons ouGoogle Guava. Vamos nos concentrar na implementação da biblioteca Guava.
2. CountingOutputStream
2.1. Dependência do Maven
CountingOutputStream faz parte do pacote Guava do Google.
Vamos começar adicionando a dependência aopom.xml:
com.google.guava
guava
24.1-jre
A versão mais recente da dependência pode ser verificadahere.
2.2. Detalhes da turma
A classe estendejava.io.FilterOutputStream, substitui os métodoswrite()eclose() e fornece o novo métodogetCount().
O construtor usa outro objetoOutputStream como parâmetro de entrada. While writing data, the class then counts the number of bytes written into this OutputStream.
Para obter a contagem, podemos simplesmente chamargetCount() para retornar o número atual de bytes:
/** Returns the number of bytes written. */
public long getCount() {
return count;
}
3. Caso de Uso
Vamos usarCountingOutputStream em um caso de uso prático. A título de exemplo, vamos colocar o código em um teste JUnit para torná-lo executável.
Em nosso caso, vamos gravar dados em umOutputStreame verificar se atingimos o limite deMAX bytes.
Quando atingimos o limite, queremos interromper a execução lançando uma exceção:
public class GuavaCountingOutputStreamUnitTest {
static int MAX = 5;
@Test(expected = RuntimeException.class)
public void givenData_whenCountReachesLimit_thenThrowException()
throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
CountingOutputStream cos = new CountingOutputStream(out);
byte[] data = new byte[1024];
ByteArrayInputStream in = new ByteArrayInputStream(data);
int b;
while ((b = in.read()) != -1) {
cos.write(b);
if (cos.getCount() >= MAX) {
throw new RuntimeException("Write limit reached");
}
}
}
}
4. Conclusão
Neste artigo rápido, vimos a classeCountingOutputStream e seu uso. A classe fornece o método adicionalgetCount() que retorna o número de bytes gravados emOutputStream até o momento.
Finalmente, como sempre, o código usado durante a discussão pode ser encontradoover on GitHub.