Байтовые и символьные потоки
Система ввода-вывода
До этого мы только выводили информацию на экран, но никогда не считывали ее с клавиатуры. Дело в том, что в Java достаточно нетривиальная система ввода-вывода. И если с выводом информации на экран особых проблем не возникает, то ввод информации в программы (в частности, с клавиатуры) — задача не самая простая. Для реализации ввода приходится решать несколько вспомогательных задач, в том числе прибегать к созданию потоков и обрабатывать возможные исключительные ситуации.
Причина такого состояния дел с вводом и выводом в Java объясняется достаточно просто и прозаично. Язык Java создавался не для того, чтобы писать консольные программы. Писать консольную программу на Java — все равно, что съездить на танке на рынок, чтобы купить десяток-другой яиц. Танки предназначены для других целей, хотя с их помощью успешно можно решить и упомянутую задачу.
Ввод и вывод данных в Java реализуется через потоки ввода-вывода (stream) Не надо путать с программными потоками (thread), рассмотренными в лекции «Пакеты и интерфейсы».
Выделяют два типа потоков: байтовые и символьные. На самом деле, в обоих случаях речь идет о байтах, но поскольку символ — это два байта, то при работе с символьными потоками байты обрабатываются, условно говоря, парами.
Для работы с символьными и байтовыми потоками используются специально разработанные для этого классы. Чтобы эти классы стали доступными в программе, необходимо подключить (импортировать) пакет java.io.
Байтовые и символьные потоки
На вершине иерархии байтовых потоков находятся два абстрактных класса: InputStream и OutputStream. В этих классах определены методы read() и write(), предназначенные для чтения данных из потока и записи данных в поток соответственно.
Некоторые другие классы байтовых потоков перечислены в табл. 1.
Таблица 1.Классы байтовых потоков
Класс байтового потока | Описание |
InputStream | Абстрактный класс, который описывает поток ввода |
OutputStream | Абстрактный класс, который описывает поток вывода |
FilterInputStream | Класс, который реализует абстрактный класс InputStream |
FilterOutputStream | Класс, который реализует абстрактный класс OutputStream |
BufferedInputStream | Класс буферизованного потока ввода |
BufferedOutputStream | Класс буферизованного потока вывода |
ByteArrayInputStream | Класс потока ввода для считывания из массива |
ByteArrayOutputStream | Класс потока вывода для записи в массив |
FileInputStream | Класс потока ввода для считывания из файла |
FileOutputStream | Класс потока вывода для записи в файл |
Класс байтового потока | Описание |
DataInputStream | Класс потока ввода с методами для считывания данных стандартных типов Java |
DataOutputStream | Класс потока вывода с методами для записи данных стандартных типов Java |
PrintStream | Класс потока вывода, который поддерживает методы print()и println() |
Иерархия классов для символьных потоков ввода-вывода начинается с абстрактных классов Reader и Writer. В этих классах определены методы read() для считывания символьных данных из потока и write() для записи символьных данных в поток. Некоторые из классов для символьных потоков представлены
и кратко описаны в табл. 2.
Таблица 2.Классы символьных потоков Java
Класс символьного потока | Описание |
Reader | Абстрактный класс, который описывает поток ввода |
Writer | Абстрактный класс, который описывает поток вывода |
FilterReader | Класс, который описывает отфильтрованный поток ввода |
FilterWriter | Класс, который описывает отфильтрованный поток вывода |
InputStreamReader | Класс потока ввода, который переводит байты в символы |
OutputStreamWriter | Класс потока вывода, который переводит символы в байты |
StringReader | Класс потока ввода для считывания из текстовой строки |
StringWriter | Класс потока вывода для записи в текстовую строку |
FileReader | Класс потока ввода для считывания из файла |
FileWriter | Класс потока вывода для записи в файл |
BufferedReader | Класс буферизованного потока ввода |
BufferedWriter | Класс буферизованного потока вывода |
PrintWriter | Класс потока вывода, который поддерживает методы print()и println() |
CharArrayReader | Класс потока ввода для считывания из массива |
CharArrarWriter | Класс потока вывода для записи в массив |
LineNumberReader | Класс потока ввода для подсчета текстовых строк |
Часть возможностей ввода-вывода может быть реализована посредством класса System. Класс System содержит три переменных потока: in, out и err. Эти поля имеют атрибуты public и static. В частности: Поле System.out — поток стандартного вывода. По умолчанию он связан с консолью. Поле System.out является объектом класса PrintStream. Поле System.in — это поток стандартного ввода. По умолчанию он связан с клавиатурой. Поле является объектом класса InputStream.
Поле System.err — это стандартный поток ошибок. По умолчанию поток связан с консолью. Поле является объектом класса PrintStream.
Методы для работы с классами потоков ввода-вывода мы рассмотрим на конкретных примерах.
Дата добавления: 2016-06-22; просмотров: 4698;