На этом шаге мы рассмотрим класс ByteArrayInputStream
Класс ByteArrayInputStream реализует поток ввода, использующий массив байтов в качестве источника данных. У этого класса имеется два конструктора, каждому из которых требуется массив байтов в качестве источника данных:
ByteArrayInputStream(byte[] b); ByteArrayInputStream(byte[] b, int start, int count);
Второй конструктор данного класса создает объект типа InputStream из подмножества массива байтов, начиная с символа на позиции, определяемом start, и длиной, задаваемой параметром count.
Метод close() не оказывает никакого влияния на объект класса ByteArrayInputStream, поэтому вызывать его для данного объекта не нужно, хотя это и не считается ошибкой.
Рассмотрим следующий пример:
import java.io.ByteArrayInputStream; public class Main { public static void main(String[] args) { String tmp = "abcdefghijklmnopqrstuvwxyz"; byte[] bytes = tmp.getBytes(); ByteArrayInputStream input1 = new ByteArrayInputStream(bytes); ByteArrayInputStream input2 = new ByteArrayInputStream(bytes, 0, 3); } }
Проект можно взять здесь
В данном примере создается пара объектов класса ByteArrayInputStream, которая инициализируется байтами, представляющими английский алфавит. Объект input1 содержит полный алфавит в нижнем регистре, в то время как объект input2 – только первые три буквы.
Класс ByteArrayInputStream реализует методы mark() и reset(). Но если метод mark() не вызывается, то метод reset() устанавливает указатель на начало потока ввода (в данном случае – в начало массива байтов, передаваемого конструктору данного класса). В приведенном ниже примере показано, как пользоваться методом reset() для чтения одних и тех же вводимых данных дважды. В данном примере программа читает и выводит буквы “abc” сначала в нижнем регистре, а затем в верхнем.
import java.io.ByteArrayInputStream; public class Main { public static void main(String[] args) { String tmp = "abc"; byte[] bytes = tmp.getBytes(); ByteArrayInputStream in = new ByteArrayInputStream(bytes); int c; while ((c = in.read()) != -1) { char symbol = (char) c; System.out.print(symbol); } System.out.println(); in.reset(); while ((c = in.read()) != -1) { char symbol = Character.toUpperCase((char) c); System.out.print(symbol); } } }
Проект можно взять здесь
Рис. 1. Вывод программы
В данном примере каждый символ сначала читается из потока ввода, а затем выводится без изменений в нижнем регистре. Далее поток ввода устанавливается в исходное состояние, и чтение данных начинается снова, но на этот раз каждый символ преобразуется в верхний регистр перед выводом.
На следующем шаге мы рассмотрим класс ByteArrayOutputStream