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 .