Spec-Zone .ru
спецификации, руководства, описания, API
|
До JDK 1.1, стандартные средства ввода-вывода поддерживаемые только потоки байтов, через InputStream и классы OutputStream и их подклассы. Символьные потоки походят на потоки байтов, но они содержат 16-разрядные символы Unicode, а не восьмиразрядные байты. Они реализуются Reader и классами Writer и их подклассами. Reader s и Writer s поддерживают по существу те же самые операции как InputStream s и OutputStream s, за исключением того, что, где методы потока байтов работают на байтах или байтовых массивах, символьно-потоковые методы работают на символах, символьных массивах, или строках.
Большая часть функциональности, доступной для потоков байтов, также обеспечивается для символьных потоков. Это отражается от имени каждого символьно-потокового класса, префикс которого обычно совместно используется с именем соответствующего класса потока байтов. Например, есть класс PushbackReader, который обеспечивает ту же самую функциональность для символьных потоков, которая обеспечивается PushbackInputStream для потоков байтов.
Java хранит строки в Unicode, кодировка символов международного стандарта, которая способна к представлению большинства письменных языков в мире. Типичные читаемые пользователем текстовые файлы, однако, используют кодировки, которые не обязательно связываются с Unicode, или даже с ASCII, и есть много таких кодировок. Символьные потоки скрывают сложность контакта с этими кодировками, обеспечивая два класса, которые служат мостами между потоками байтов и символьными потоками. Класс InputStreamReader реализует поток ввода символов, который читает байты из введенного байтом потока и преобразовывает их в символы согласно указанному кодированию. Точно так же класс OutputStreamWriter реализует поток вывода символов, который преобразовывает символы в байты согласно указанному кодированию и пишет им в поток вывода байта.
Второе преимущество символьных потоков состоит в том, что они потенциально намного более эффективны чем потоки байтов. Реализации многих из исходных потоков байтов Java ориентируются вокруг операций чтения байта за один раз и операций записи. Символьно-потоковые классы, напротив, ориентируются вокруг буферных за один раз операций чтения и операций записи. Это различие, в комбинации с более эффективной схемой блокировки, позволяет символьным потоковым классам восполнять добавленные издержки кодирования преобразования во многих случаях.
Символьно-потоковый класс | Описание | Соответствующий класс байта |
---|---|---|
Reader | Абстрактный класс для потоков ввода символов | InputStream |
BufferedReader | Буферный ввод, строки синтаксических анализов | BufferedInputStream |
LineNumberReader | Отслеживает номера строки | LineNumberInputStream |
CharArrayReader | Чтения от символьного массива | ByteArrayInputStream |
InputStreamReader | Преобразовывает поток байтов в символьный поток | (ни один) |
FileReader | Преобразовывает байты из файла в символьный поток | FileInputStream |
FilterReader | Абстрактный класс для фильтруемого ввода символов | FilterInputStream |
PushbackReader | Позволяет символам быть пододвинутыми обратно | PushbackInputStream |
PipedReader | Чтения от PipedWriter | PipedInputStream |
StringReader | Чтения от String | StringBufferInputStream |
Writer | Абстрактный класс для потоков вывода символов | OutputStream |
BufferedWriter | Буферный вывод, разделитель строки платформы использования | BufferedOutputStream |
CharArrayWriter | Записи символьному массиву | ByteArrayOutputStream |
FilterWriter | Абстрактный класс для фильтруемого вывода символов | FilterOutputStream |
OutputStreamWriter | Преобразовывает символьный поток в поток байтов | (ни один) |
FileWriter | Преобразовывает символьный поток в файл байта | FileOutputStream |
PrintWriter | Значения печатных изданий и объекты к Writer | PrintStream |
PipedWriter | Записи к PipedReader | PipedOutputStream |
StringWriter | Записи к String | (ни один) |
Основное побуждение для того, чтобы изменить класс PrintStream - то, что он сделает System.out и System.err более полезными для людей, пишущих программы Java на платформах, где локальное кодирование - что-то другое чем ASCII. PrintStream, другими словами, обеспечивается прежде всего для использования в отладке и для совместимости с существующим кодом. Код, который производит текстовый вывод, должен использовать новый класс PrintWriter, который позволяет кодировке символов быть определенной или кодировка по умолчанию, которая будет принята. Для удобства класс PrintWriter предоставляет конструкторам, которые берут OutputStream, возражают и создают промежуточный объект OutputStreamWriter, который использует кодировку по умолчанию.
Следующие конструкторы и методы были осуждены, потому что они должным образом не преобразовывают между байтами и символами:
Наконец, следующий конструктор и методы были добавлены:
StreamTokenizer(Reader) | |
byte[] | String.getBytes() |
void | Throwable.printStackTrace(PrintWriter) |