Использование Guava CountingOutputStream

Использование Guava CountingOutputStream

 

1. обзор

В этом руководстве мы рассмотрим классCountingOutputStream и его использование.

Класс можно найти в популярных библиотеках, таких какApache Commons илиGoogle Guava. Мы сосредоточимся на реализации в библиотеке Guava.

2. CountingOutputStreamс

2.1. Maven Dependency

CountingOutputStream является частью пакета Google Guava.

Начнем с добавления зависимости кpom.xml:


    com.google.guava
    guava
    24.1-jre

Последнюю версию зависимости можно проверитьhere.

2.2. Детали класса

Класс расширяетjava.io.FilterOutputStream, переопределяет методыwrite() иclose() и предоставляет новый методgetCount().

Конструктор принимает в качестве входного параметра еще один объектOutputStream. While writing data, the class then counts the number of bytes written into this OutputStream.

Чтобы получить счетчик, мы можем просто вызватьgetCount(), чтобы вернуть текущее количество байтов:

/** Returns the number of bytes written. */
public long getCount() {
    return count;
}

3. Случай использования

Давайте использоватьCountingOutputStream в практическом случае. В качестве примера мы собираемся поместить код в тест JUnit, чтобы сделать его исполняемым.

В нашем случае мы собираемся записать данные вOutputStream и проверить, достигли ли мы ограничения в байтахMAX.

Как только мы достигнем предела, мы хотим прервать выполнение, выдав исключение:

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. Заключение

В этой быстрой статье мы рассмотрели классCountingOutputStream и его использование. Класс предоставляет дополнительный методgetCount(), который возвращает количество байтов, записанных на данный момент вOutputStream.

Наконец, как всегда, код, использованный во время обсуждения, можно найтиover on GitHub.