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