Перейти к основному содержимому

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

· 2 мин. чтения

1. Обзор

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

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

2. Подсчет выходного потока

2.1. Зависимость от Maven

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

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

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>

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

2.2. Сведения о классе

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

Конструктор принимает другой объект OutputStream в качестве входного параметра. При записи данных класс затем подсчитывает количество байтов, записанных в этот 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 .

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