Вроде бы в оба можно записывать, вроде бы из обоих можно читать. В чем их различия?
Начнем с того, что записать информацию в 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()
.
Оба потока после работы закрывать не нужно.
Вот такие, вот, различия. А какой из них использовать - решайте, опираясь на данные мной выше св-ва каждого из классов.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В активити есть виджет ViewPager, у viewpager'a есть адаптер FragmentPagerAdapter, который принимает список из 4 одинаковых фрагментов, но с разными аргументами
Я пытаюсь запустить проект maven в среде intelij idea comunity 2019Данный проект является веб-приложением которое использует фреймворк spring
Распространенная задача, получение данныхНапример, получаю данные о профиле с сервера