ГЛАВА 6. ПОТОКИ ДАННЫХ. РАБОТА С



ЛОКАЛЬНЫМИ ФАЙЛАМИ

 

Организация ввода-вывода в Java

 

Для того чтобы отвлечься от особенностей конкретных устройств ввода/вывода, в Java употребляется понятие потока (stream). Считается, что в программу идет входной поток (input stream) символов Unicode или просто байтов, воспринимаемый в программе методами read(). Из программы методами write(), print(), println() выводится выходной поток (output stream) символов или байтов. При этом неважно, куда направлен поток: на консоль, на принтер, в файл или в сеть.

Конечно, полное игнорирование особенностей устройств ввода/вывода сильно замедляет передачу информации. Поэтому в Java все-таки выделяется файловый ввод/вывод, вывод на печать, сетевой поток.

В классе system определены три потока статическими полями in, out и err. Они называются соответственно стандартным вводом (stdin), стандартным выводом (stdout) и стандартным выводом сообщений (stderr). Эти стандартные потоки могут быть соединены с разными конкретными устройствами ввода и вывода.

Потоки out и err — это экземпляры класса PrintStream, организующего выходной поток байтов. Эти экземпляры выводят информацию на консоль методами print(), println() и write(), которых в классе PrintStream имеется около двадцати для разных типов аргументов.

Поток err предназначен для вывода системных сообщений программы: трассировки, сообщений об ошибках или, просто, о выполнении каких-то этапов программы.

Поток in — это экземпляр класса InputStream. Он назначен на клавиатурный ввод с консоли методами read().

Еще один вид потока — поток байтов, составляющих объект Java. Его можно направить в файл или передать по сети, а потом восстановить в оперативной памяти. Эта операция называется сериализацией (serialization) объектов.

Методы организации потоков собраны в классы пакета java.io.

Кроме классов, организующих поток, в пакет java.io входят классы с методами преобразования потока, например, можно преобразовать поток байтов, образующих целые числа, в поток этих чисел.

 

Классы потоков ввода-вывода

 

Итак, в Java есть целых четыре иерархии классов для создания, преобразования и слияния потоков. Во главе иерархии четыре класса, непосредственно расширяющих класс Object:

Reader — абстрактный класс, в котором собраны самые общие методы символьного ввода;

Writer— абстрактный класс, в котором собраны самые общие методы символьного вывода;

InputStream — абстрактный класс с общими методами байтового ввода;

OutputStream — абстрактный класс с общими методами байтового вывода.

Классы входных потоков Reader и InputStream определяют по три метода ввода:

read() — возвращает один символ или байт, взятый из входного потока, в виде целого значения типа int; если поток уже закончился, возвращает -1;

read(char[] buf) — заполняет заранее определенный массив buf символами из входного потока; в классе Inputstream массив типа byte[]; метод возвращает фактическое число взятых из потока элементов или -1, если поток уже закончился;

read(char[] buf, int offset, int len) — заполняет часть символьного или байтового массива buf, начиная с индекса offset, число взятых из потока элементов равно len; метод возвращает фактическое число взятых из потока элементов или -1.

Эти методы выбрасывают IOException, если произошла ошибка ввода/вывода.

Классы выходных потоков Writer и OutputStream определяют по три почти одинаковых метода вывода:

write(char[] buf) — выводит массив в выходной поток, в классе Outputstream массив имеет тип byte[];

write(char[] buf, int offset, int len) — выводит len элементов массива buf, начиная с элемента с индексом offset;

write(int elem) в классе Writer - выводит 16, а в классе Outputstream 8 младших битов аргумента elem в выходной поток,

В классе Writer есть еще два метода:

write(string s) — выводит строку s в выходной поток;

write(String s, int offset, int len) — выводит len символов строки s, начиная с символа с номером offset.

Многие подклассы классов Writer и OutputStream осуществляют буферизованный вывод. При этом элементы сначала накапливаются в буфере, в оперативной памяти, и выводятся в выходной поток только после того, как буфер заполнится. Часто надо вывести информацию в поток еще до заполнения буфера. Для этого предусмотрен метод flush().

Наконец, по окончании работы с потоком его необходимо закрыть методом close().

Все классы пакета java.io можно разделить на две группы: классы, создающие поток (data sink), и классы, управляющие потоком (data processing).


Дата добавления: 2018-04-15; просмотров: 266; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!