Ограничение емкости ByteArrayOutputStream

Создаю ByteArrayOutputStream barr = new ByteArrayOutputStream(1);, т.е. емкостью 1 байт и пишу в него больше 1 байта barr.write("123456789000000".getBytes());. Ошибки не возникает, я проверяю длину barr, она равна 15. Почему мое письмо не было заблокировано или завернуто? Есть ли способ предотвратить запись больше, чем емкость, и какой outputstream можно использовать для этого? Я очень ограничен в доступной памяти и не хочу писать туда больше, чем позволяют мои ограничения

P.S. Большое спасибо за ответы! У меня был следующий вопрос Было бы здорово, если бы вы могли посмотреть


person Yakov    schedule 08.10.2015    source источник
comment
Согласно Javadoc, буфер автоматически увеличивается по мере записи в него данных. Справочник   -  person aryn.galadar    schedule 08.10.2015
comment
То есть - данная емкость является исходной?   -  person Yakov    schedule 08.10.2015
comment
Правильно - параметр int в конструкторе - это просто начальный размер буфера массива.   -  person aryn.galadar    schedule 08.10.2015


Ответы (3)


Это связано с тем, что емкость, которую вы указываете конструктору, является начальным размером буфера. Если вы записываете больше данных, буфер будет автоматически перераспределен с большим размером, чтобы вместить больше данных.

Насколько я знаю, с ByteArrayOutputStream никак нельзя ограничить рост буфера. Вместо этого вы можете использовать что-то другое, например java.nio.ByteBuffer, которое имеет фиксированный размер.

person Jesper    schedule 08.10.2015

ByteArrayOutputStream увеличит резервный массив, если вы попытаетесь записать больше байтов. Обычно это считается хорошей вещью.

Если вам нужно другое поведение, вы всегда можете написать свою собственную реализацию OutputStream, которая выдает исключение IOException, если количество записываемых байт превышает емкость.

ByteArrayOutputStream не является окончательным, поэтому вы можете расширить его. Я думаю, все, что вам нужно сделать, это переопределить write(int) и write(byte[], int, int), чтобы генерировать исключение, если количество записываемых байтов превышает оставшееся количество. Поля buf и count защищены, поэтому ваш подкласс должен иметь возможность видеть, какая часть резервного массива записана и длина массива.

person dkatzel    schedule 08.10.2015

У меня была та же проблема, и в конце концов я обнаружил существующую реализацию того же самого в Hadoop — BoundedByteArrayOutputStream.java

person Matt Sheppard    schedule 21.04.2017