Производными от классов InputStream и OutputStream являются конкретные подклассы, реализующие различные функциональные возможности и учитывающие особенности обмена данными с разными устройствами, например ввода-вывода в файлы на диске. Классы байтовых потоков приведены в табл. 10.1. Не следует пугаться большого количества этих классов: изучив один из них, легко освоить остальные.
Таблица 10.1. Классы байтовых потоков Класс байтового потока Описание BufferedlnputStream Буферизованный поток ввода BufferedOutputStream Буферизованный поток вывода ByteArrayInputStream Поток ввода для чтения из байтового массива ByteArrayOutputStream Поток вывода для записи в байтовый массив DatalnputStream Поток ввода с методами для чтения стандартных типов данных Java DataOutputStream Поток вывода с методами для записи стандартных типов данных Java FileInputStream Поток ввода для чтения из файла FileOutputStream Поток вывода для записи в файл FilterlnputStream Подкласс, производный от класса InputStream FilterOutputStream Подкласс, производный от класса OutputStream InputStream Абстрактный класс, описывающий потоковый ввод ObjectInputStream Поток для ввода объектов ObjectOutputStream Поток для вывода объектов OutputStream Абстрактный класс, описывающий потоковый вывод PipedlnputStream Поток конвейерного ввода PipedOutputStream Поток конвейерного вывода PrintStream Поток вывода с методами print и println PushbacklnputStream Поток ввода с возвратом прочитанных байтов в поток RandomAccessFile Класс, поддерживающий файловый ввод-вывод с произвольным доступом SequenceInputStream Поток ввода, сочетающий в себе несколько потоков ввода для поочередного чтения данных из них Классы символьных потоков
Для определения символьных потоков служат две иерархические структуры классов, на вершине которых находятся абстрактные классы Reader и Writer соответственно. Класс Reader и его подклассы используются для чтения, а класс Writer и его подклассы — для записи данных. Конкретные классы, производные от классов Reader и Writer, оперируют символами в уникоде.
Классы, производные от классов Reader и Writer, предназначены для выполнения различных операций ввода-вывода символов. Символьные классы присутствуют в Java параллельно с байтовыми классами. Классы символьных потоков приведены в табл. 10.2. Таблица 10.2. Классы символьных потоков Класс символьного потока Описание BufferedReader Буферизованный поток ввода символов BufferedWriter Буферизованный поток вывода символов CharArrayReader Поток ввода для чтения из символьного массива CharArrayWriter Поток вывода для записи в символьный массив FileReader Поток ввода для чтения символов из файла FileWriter Поток вывода для записи символов в файл FilterReader Класс для чтения символов с фильтрацией FilterWriter Класс для записи символов с фильтрацией InputStreamReader Поток ввода с преобразованием байтов в символы LineNumberReader Поток ввода с подсчетом символьных строк OutputStreamWriter Поток вывода с преобразованием символов в байты PipedReader Поток конвейерного ввода PipedWriter Поток конвейерного вывода PrintWriter Поток вывода с методами print и println PushbackReader Поток ввода с возвратом прочитанных символов в поток Reader Абстрактный класс, описывающий потоковый ввод символов StringReader Поток ввода для чтения из символьной строки StringWriter Поток вывода для записи в символьную строку Writer Абстрактный класс, описывающий потоковый вывод символов Встроенные потоки
Как вам должно быть уже известно, во все программы на Java автоматически импортируется пакет java. lang. В этом пакете определен класс System, инкапсулирующий некоторые элементы среды выполнения программ. Помимо прочего, в нем содержатся предопределенные переменные in, out и err, представляющие стандартные потоки ввода-вывода. Эти поля объявлены как public, final и static. А это означает, что ими можно пользоваться в любой другой части программы, не ссылаясь на конкретный объект типа System.
Переменная System.out ссылается на поток стандартного вывода. По умолчанию этот поток связан с консолью. А переменная System, in ссылается на поток стандартного ввода (по умолчанию с клавиатуры). И наконец, переменная System.err ссылается на поток стандартных сообщений об ошибках, которые по умолчанию выводятся на консоль. По мере необходимости все эти потоки могут быть перенаправлены на другие совместимые устройства ввода-вывода.