2015-10-08 3 views
0

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

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

+0

Согласно Javadoc, «Буфер автоматически растет, когда данные записываются». [Ссылка] (http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html) –

+0

I.e - данная емкость является начальной? – Yakov

+1

Исправить - int-параметр в конструкторе - это только начальный размер буфера массива. –

ответ

1

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

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

1

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

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

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

0

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

Смежные вопросы