Шаг 91.
Язык программирования Java.
Класс ByteArrayInputStream

На этом шаге мы рассмотрим класс 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

Предыдущий шаг Содержание Следующий шаг