Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
файлы.doc
Скачиваний:
2
Добавлен:
11.09.2019
Размер:
194.56 Кб
Скачать

25

1Потоки ввода/вывода

1.1Потоки в Java

В Java выделяется файловый ввод/вывод, вывод на печать, сетевой поток.

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

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

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

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

В Java имеется возможность переназначения потока, с консоли в файл.

В Java предусмотрена возможность создания потоков, направляющих символы или байты не на внешнее устройство, а в массив или из массива. Это позволяет обрабатывать данные в строках или массивах как в файлах.

Кроме того, Java можно создать канал (pipe) обмена информацией между подпроцессами.

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

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

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

Еще одна возможность, предоставляемая классами пакета java.io, — слить несколько потоков в один поток.

1.2Иерархия классов

Во главе иерархии четыре класса, построенных от класса 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, если произошла ошибка ввода/вывода.

Четвертый метод skip (long n) пропускает в потоке начиная с текущей позиции на n символов или байт вперед. Эти элементы потока не вводятся методами read(). Метод возвращает реальное число пропущенных элементов, которое может отличаться от n, например, если поток закончился.

Текущий элемент потока можно пометить методом mark (int n), а затем вернуться к помеченному элементу методом reset(), но не более чем через n элементов. Не все подклассы реализуют эти методы, поэтому перед расстановкой пометок следует обратиться к логическому методу marksupported(), который возвращает true, если реализованы методы расстановки и возврата к пометкам.

Классы выходных потоков 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(). Данный метод сразу же выводит все содержимое буфера в поток.

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

Рисунок 1.1 - Иерархия символьных потоков

Рисунок 1.2. - Классы байтовых потоков