Каковы различия между ByteArrayInputStream и ByteArrayOutputStream?

140
31 декабря 2021, 00:50

Вроде бы в оба можно записывать, вроде бы из обоих можно читать. В чем их различия?

Answer 1

Начнем с того, что записать информацию в ByteArrayInputStream можно один раз - с помощью конструктора. В ByteArrayOutputStream записывать можно сколько угодно с помощью двух вариаций(перегрузка) метода write:

write(byte[] array, int start, int limit)

(запись limit элементов массива array, начиная с id, равному start)
и

write(int element)

(запись одного байта - element)

Также стоит заметить, что ByteArrayOutputStream имеет метод, вызывающий метод write к своему содержимому у других выходных потоков:

writeTo(OutputStream out)

ByteArrayInputStream такого метода не имеет. Однако, никто не мешает вызвать у других выходных потоков метод write к содержимому потока ByteArrayInputStream. Немаловажно, что оба потока можно сбросить - вернуться в самое начало к первому записанному символу(или к символу, отмеченному с помощью метода mark(int position) в случае ByteArrayInputStream, по стандарту равен 0) с помощью метода reset(). В случае с ByteArrayOutputStream массивы трутся, с ByteArrayInputStream - перемещается лишь маячок для считывания, можно заново считывать массив. Теперь перейдем к получению записанных byte'ов. В ByteArrayInputStream получить можно с помощью двух вариаций(перегрузка) метода read:

write(byte[] array, int start, int limit)

(получение limit элементов в массив array, начиная с id, равному start)
и

read()

(читает следующий байт)
Также можно пропустить n-ое количество байтов с помощью метода skip:

skip(long n)

У ByteArrayOutputStream все куда деревянней, у него чтение происходит помощью следующих методов:

toByteArray()

(получаем массив байтов)

toString()

(переводит массив байтов сразу в строку)

То есть мы можем получить содержимое только полностью, не кусками.

Получение длины потока(сколько можно еще прочитать!) в ByteArrayInputStream производится с помощью метода available(), а в ByteArrayOutputStream(понятное дело, что полная длина) - с помощью метода size().
Оба потока после работы закрывать не нужно.

Вот такие, вот, различия. А какой из них использовать - решайте, опираясь на данные мной выше св-ва каждого из классов.

READ ALSO
ViewPager загружает не все фрагменты

ViewPager загружает не все фрагменты

В активити есть виджет ViewPager, у viewpager'a есть адаптер FragmentPagerAdapter, который принимает список из 4 одинаковых фрагментов, но с разными аргументами

176
No JDK specified

No JDK specified

Я пытаюсь запустить проект maven в среде intelij idea comunity 2019Данный проект является веб-приложением которое использует фреймворк spring

235
Работа с паттерном Repository

Работа с паттерном Repository

Распространенная задача, получение данныхНапример, получаю данные о профиле с сервера

163
Не работает repaint в JPanel

Не работает repaint в JPanel

Всем приветПроблема такова

145