Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Символьные потоки (Представленный в JDKTM 1.1)

Версия 1.1 Комплекта разработчика JavaTM представленная поддержка символьных потоков к пакету java.io.

До 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 ориентируются вокруг операций чтения байта за один раз и операций записи. Символьно-потоковые классы, напротив, ориентируются вокруг буферных за один раз операций чтения и операций записи. Это различие, в комбинации с более эффективной схемой блокировки, позволяет символьным потоковым классам восполнять добавленные издержки кодирования преобразования во многих случаях.

Краткий обзор API

Символьно-потоковые классы были разработаны, чтобы быть параллельными существующим классам потока байтов в пакете java.io. Как отмечено выше, имя каждого символьно-потокового класса заканчивается в Reader или Writer, как соответствующий, в то время как его префикс обычно совместно используется с соответствующим классом потока байтов, если любой. Следующая таблица суммирует новые классы; в левом столбце добавление отступа указывает на отношения подкласса.
Символьно-потоковый класс Описание Соответствующий класс байта
 
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

Класс PrintStream был изменен, чтобы использовать кодировку символов платформы по умолчанию и разделитель строки платформы по умолчанию. Таким образом каждый PrintStream включает OutputStreamWriter, и он передает все символы через этого писателя, чтобы произвести байты для вывода. Методы println используют разделитель строки платформы по умолчанию, который определяется системным свойством line.separator и является не обязательно единственным символом новой строки ('\n'). Байты и байтовые массивы, записанные через существующие методы write, не передают через писателя.

Основное побуждение для того, чтобы изменить класс PrintStream - то, что он сделает System.out и System.err более полезными для людей, пишущих программы Java на платформах, где локальное кодирование - что-то другое чем ASCII. PrintStream, другими словами, обеспечивается прежде всего для использования в отладке и для совместимости с существующим кодом. Код, который производит текстовый вывод, должен использовать новый класс PrintWriter, который позволяет кодировке символов быть определенной или кодировка по умолчанию, которая будет принята. Для удобства класс PrintWriter предоставляет конструкторам, которые берут OutputStream, возражают и создают промежуточный объект OutputStreamWriter, который использует кодировку по умолчанию.

Другие классы

Следующие конструкторы и методы были осуждены, потому что они должным образом не преобразовывают между байтами и символами:

String   DataInputStream.readLine()
InputStream   Runtime.getLocalizedInputStream(InputStream)
OutputStream   Runtime.getLocalizedOutputStream(OutputStream)
  StreamTokenizer(InputStream)
   String(byte ascii[], int hibyte, int offset, int count)
   String(byte ascii[], int hibyte)
void   String.getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin)

Наконец, следующий конструктор и методы были добавлены:

  StreamTokenizer(Reader)
byte[]   String.getBytes()
void   Throwable.printStackTrace(PrintWriter)

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами