Для работы с массивами байтов - их чтения и записи используются классы ByteArrayInputStream и ByteArrayOutputStream.
Класс ByteArrayInputStream представляет входной поток, использующий в качестве источника данных массив байтов. Он имеет следующие конструкторы:
ByteArrayInputStream(byte[] buf) ByteArrayInputStream(byte[] buf, int offset, int length)
В качестве параметров конструкторы используют массив байтов buf
, из которого производится считывание, смещение относительно начала массива
offset
и количество считываемых символов length
.
Считаем массив байтов и выведем его на экран:
import java.io.*; public class Program { public static void main(String[] args) { byte[] array1 = new byte[]{1, 3, 5, 7}; ByteArrayInputStream byteStream1 = new ByteArrayInputStream(array1); int b; while((b=byteStream1.read())!=-1){ System.out.println(b); } String text = "Hello world!"; byte[] array2 = text.getBytes(); // считываем 5 символов ByteArrayInputStream byteStream2 = new ByteArrayInputStream(array2, 0, 5); int c; while((c=byteStream2.read())!=-1){ System.out.println((char)c); } } }
В отличие от других классов потоков для закрытия объекта ByteArrayInputStream
не требуется вызывать метод close
.
Класс ByteArrayOutputStream представляет поток вывода, использующий массив байтов в качестве места вывода.
Чтобы создать объект данного класса, мы можем использовать один из его конструкторов:
ByteArrayOutputStream() ByteArrayOutputStream(int size)
Первая версия создает массив для хранения байтов длиной в 32 байта, а вторая версия создает массив длиной size
.
Рассмотрим применение класса:
import java.io.*; public class Program { public static void main(String[] args) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); String text = "Hello Wolrd!"; byte[] buffer = text.getBytes(); try{ baos.write(buffer); } catch(Exception ex){ System.out.println(ex.getMessage()); } // превращаем массив байтов в строку System.out.println(baos.toString()); // получаем массив байтов и выводим по символьно byte[] array = baos.toByteArray(); for(byte b: array){ System.out.print((char)b); } System.out.println(); } }
Как и в других потоках вывода в классе ByteArrayOutputStream
определен метод write
, который записывает в поток некоторые данные.
В данном случае мы записываем в поток массив байтов. Этот массив байтов записывается в объекте ByteArrayOutputStream в защищенное поле buf
,
которое представляет также массив байтов (protected byte[] buf
).
Так как метод write
может сгенерировать исключение, то вызов этого метода помещается в блок try..catch.
Используя методы toString()
и toByteArray()
, можно получить массив байтов buf в виде текста или непосредственно в виде массива байт.
С помощью метода writeTo
мы можем вывести массив байт в другой поток. Данный метод в качестве параметра принимает объект OutputStream
,
в который производится запись массива байт:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); String text = "Hello Wolrd!"; byte[] buffer = text.getBytes(); try{ baos.write(buffer); } catch(Exception ex){ System.out.println(ex.getMessage()); } try(FileOutputStream fos = new FileOutputStream("hello.txt")){ baos.writeTo(fos); } catch(IOException e){ System.out.println(e.getMessage()); }
После выполнения этой программы в папке с программой появится файл hello.txt, который будет содержать строку "Hello Wolrd!".
И в заключении также надо сказать, что как и для объектов ByteArrayInputStream, для ByteArrayOutputStream не надо явным образом закрывать поток с помощью метода
close
.