Философия Java3
Шрифт:
Класс BufferedOutputStream модифицирует поток так, чтобы использовалась буферизация при записи данных, которая предотвращает слишком частые обращения к физическому устройству. Вероятно, именно его следует порекомендовать для вывода в поток каких-либо данных.
Таблица 16.4. Разновидности надстроек FilterOutputStream
Аргументы конструктора, порядок применения
Класс
Назначение
Используется в сочетании с классом DatalnputStream, позволяет записывать в поток примитивы (целые, символы и т. д.) независимо от платформы При записи форматирует
DataOutputStream
PrintStream
BufferedOutputStream
Используется для буферизации вывода, то есть для предотвращения прямой записи в устройство каждый раз при записи данных. Для записи содержимого буфера в устройство используется метод flushQ
Выходной поток OutputStream. Содержит все необходимое для записи простейших типов данных
Выходной поток OutputStream, а также необязательный логический (boolean) аргумент, показывающий, нужно ли очищать буфер записи при переходе на новую строку.
Должен быть последним в «наслоении» объектов для выходного потока OutputStream. Вероятно, вы будете часто его использовать Выходной поток OutputStream, а также размер буфера записи (необязательно). Не предоставляет интерфейса как такового, просто указывает, что при выводе необходимо использовать буферизацию. К классу следует присоединить более содержательный класс-«фильтр»
Классы Reader и Writer
При выпуске Java версии 1.1 в библиотеке ввода/вывода были сделаны значительные изменения. Когда в первый раз видишь новые классы, основанные на базовых классах Reader и Writer, возникает мысль, что они пришли на замену классам InputStream и OutputStream. Тем не менее это не так. Хотя некоторые аспекты изначальной библиотеки ввода/вывода, основанной на потоках, объявлены устаревшими (и при их использовании компилятор выдаст соответствующее предупреждение), классы InputStream и OutputStream все еще предоставляют достаточно полезные возможности для проведения байт-ориентированного ввода/ вывода. Одновременно с этим классы Reader и Writer позволяют проводить операции символьно ориентированного ввода/вывода, в кодировке Юникод. Дополнительно:
1. В Java 1.1 в иерархию потоков, основанную на классах InputStream и OutputStream, были добавлены новые классы. Очевидно, эта иерархия не должна была уйти в прошлое.
2. В некоторых ситуациях для решения задачи используются как «байтовые», так и «символьные» классы. Для этого в библиотеке появились классы-адаптеры: InputStreamReader конвертирует InputStream в Reader, a Output-StreamWriter трансформирует OutputStream в Writer.
Основной причиной появления иерархий классов Reader и Writer стала интернационализация. Старая библиотека ввода/вывода поддерживала только 8-битовые символы и зачастую неверно обращалась с 16-битовыми символами Юникода. Именно благодаря символам Юникода возможна интернационализация программ (простейший тип Java char (символ) также основан на Юникоде), поэтому новые классы отвечают за их правильное использование в операциях ввода/вывода. Вдобавок новые средства спроектированы так, что работают быстрее старых классов.
Источники и приемники данных
Практически у всех изначальных потоковых классов имеются соответствующие классы Reader
В табл. 16.5 показано соответствие между источниками и получателями информации двух иерархий библиотеки ввода/вывода Java.
Таблица 16.5. Соответствие между источниками и получателями информации двух иерархий библиотеки ввода/вывода Java
Источники и приемники: классы Java 1.0
Соответствующие классы Java 1.1
InputStream
Reader
адаптер: InputStreamReader
OutputStream
Writer
адаптер: OutputStreamWriter
FilelnputStream
FileReader
FileOutputStream
FileWriter
StringBufferlnputStream
StringReader
(отсутствует)
StringWriter
ByteArraylnputStream
CharArrayReader
ByteArrayOutputStream
CharArrayWriter
PipedlnputStream
PipedReader
PipedOutputStream
PipedWriter
В основном интерфейсы соответствующих друг другу классов из двух разных иерархий очень сходны, если не совпадают.
Изменение поведения потока
Для потоков InputStream и OutputStream существуют классы-«декораторы» на основе классов FilterlnputStream и FilterOutputStream. Они позволяют модифицировать изначальный поток ввода/вывода так, как это необходимо в данной ситуации. Иерархия на основе классов Reader и Writer также взяла на вооружение данный подход, но по-другому.
В табл. 16.6 соответствие классов уже не такое точное, как это было в предыдущей таблице. Причина — организация классов: в то время как BufferedOutputStream является подклассом FilterOutputStream, класс BufferedWriter не наследует от базового класса FilterWriter (от него вообще не происходит ни одного класса, хотя он и является абстрактным — видимо, его поместили в библиотеку просто для полноты картины). Впрочем, интерфейсы классов очень похожи.
Таблица 16.6. Соответствие между фильтрами двух иерархий библиотеки ввода/вывода Java
Фильтры: классы Java 1.0
Соответствующие классы Java 1.1
FilterlnputStream
FilterReader
FilterOutputStream
FilterWriter (абстрактный класс без подклассов)
BufferedlnputStream
BufferedReader
(также есть метод для чтения строк readl_ine)
BufferedOutputStream