InputStreamReader и OutputStreamWriter 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

InputStreamReader и OutputStreamWriter



 

Эти классы обеспечивают возможность преобразования байтовых потоков ввода в символьные потоки чтения и символьных потоков записи в байтовые потоки вывода соответственно, с учётом заданной кодировки символов или кодировки, принятой по умолчанию в конкретной локальной системе. Объекту InputStreamReader в качестве источника передаётся байтовый поток ввода, и InputStreamReader обеспечивает чтение соответствующих символов Unicode. Объекту OutputStreamWriter в качестве получателя передаётся байтовый поток вывода, и OutputStreamWriter сохраняет в нём байтовые представления символов Unicode.

Методы read() класса InputStreamReader обеспечивают ввод байтов из заданного потока InputStream и преобразование их в символы с использованием соответствующей кодировки. Аналогично, методы write() класса OutputStreamWriter получают переданные символы, преобразуют их в байты, используя соответствующую кодировку, и выводят в заданный поток OutputStream. В обоих классах при закрытии потока-преобразователя также закрывается и связанный с ним байтовый поток. Такое поведение не всегда желательно (например, при преобразовании данных из стандартных потоков).

Классы FileReader и FileWriter являются расширенными версиями классов InputStreamReader и OutputStreamWriter соответственно и обеспечивают возможности обработки файловых данных с поддержкой Unicode и локальных стандартов кодировки символов.

Классов ReaderInputStream и WriterOutputStream, которые могли бы обеспечить трансляцию символьных потоков в байтовые и наоборот, не существует.

Потоки Filter

 

Классы семейства фильтрованных потоков Filter – FilterInputStream, FilterOutputStream, FilterReader и FilterWriter – позволяют объединять потоки в цепочки для получения составных потоков, обладающих расширенным набором функций.

Каждый фильтрованный поток данных привязывается к другому потоку, которому передаёт полномочия по фактическому выполнению операций ввода или вывода.

Позволяется связывать в единую цепочку любое количество байтовых (символьных) Filter-потоков ввода (чтения). Источником исходных данных может быть поток, не относящийся к семейству потоков Filter. Подобным образом могут соединяться в цепочки и Filter-потоки вывода (записи). Все потоки вывода (записи) в цепочке, начиная с первого и заканчивая предпоследним, должны относиться к классу Filter, но последним может быть объект любого потокового класса вывода (записи).

Не все классы семейства Filter в действительности осуществляют изменение данных. Некоторые просто привносят дополнительные черты поведения, а другие предлагают новые интерфейсы взаимодействия с потоками.

 

Потоки Buffered

 

Классы семейства буферизованных потоков Buffered – BufferedInputStream, BufferedOutputStream, BufferedReader и BufferedWriter – осуществляют буферизацию данных, позволяющую избежать необходимости обращения к источнику (получателю) данных при выполнении каждой отдельной операции read() или write(). Эти классы часто используются в сочетании с потоками семейства File: доступ к данным на диске выполняется намного медленнее, чем к информации в буфере памяти, и средства буферизации помогают снизить потребность в обращениях к диску.

Когда метод read() потока Buffered, вызываемый для ввода (чтения) данных, обнаруживает, что буфер потока пуст, он вызывает одноимённый метод потока источника, заполняет буфер настолько большой порцией данных, насколько это возможно и возвращает запрошенные данные из буфера. При очередных обращениях к методу read() объекта Buffered данные будут извлекаться из буфера, пока его содержимое не исчерпается, и в этот момент объекту вновь придётся вызвать read() потока-источника.

Процесс повторяется до тех пор, пока не иссякнет источник данных.

Buffered – потоки вывода (записи) ведут себя аналогичным образом. Когда write() заполняет буфер данных, вызывается одноимённый метод потока-получателя, освобождающий буфер. Такой механизм буферизации помогает превратить последовательность запросов на вывод (запись) небольших порций данных, адресуемых объекту Buffered, в единственный вызов метода write() потока-получателя.

 

Потоки Piped

 

Канальные потоки, определяемые классами семейства Piped - PipedInputStream, PipedOutputStream, PipedReader и PipedWriter – используются в виде пар ввода-вывода (записи-чтения). Данные, переданные в поток вывода (записи), служат источником для потока ввода (чтения). Каналы реализуют механизм обмена данными между различными потоками вычислений.

Единственный безопасный способ обращения с потоками данных Piped связан с использованием двух потоков вычислений: один из них осуществляет вывод данных, а другой – их ввод. Когда буфер канала полностью заполняется, попытка вывода данных в него приводит к блокированию соответствующего потока вычислений. Если операции вывода и ввода выполняются одним потоком вычислений, тот будет блокирован постоянно. Поток вычислений, осуществляющий ввод, блокируется, если буфер канала пуст.

Чтобы избежать опасности «вечного» блокирования одного потока вычислений, когда его «собрат» на другом конце канала прекращает работу, каждый канал отслеживает подлинность и работоспособность потоков вычислений, обращавшихся к нему с целью вывода и ввода данных последними. Канал, прежде чем блокировать текущий поток вычислений, проверяет, «жив» ли поток на другом конце канала. Если обнаруживается, что работа противоположного потока вычислений прекращена, текущий поток генерирует исключение типа IOException.

Потоки Piped должны быть связаны друг с другом. Это можно сделать при создании потоков, передав конструктору потока PipedReader в качестве аргумента ссылку на поток PipedWriter (и наоборот, порядок несущественен) или позднее, используя метод connect().

При попытках использования потоков Piped до их соединения или связывания ранее соединённых потоков выбрасывается исключение типа IOException.

 

Байтовые потоки ByteArray

 

Массивы байтов, размещённые в оперативной памяти, могут выступать в роли источника или получателя данных при работе с потоками семейства ByteArray. Объект класса ByteArrayInputStream использует массив типа byte в качестве источника данных. В составе класса ByteArrayOutputStream предусмотрены средства динамического наращивания объёма массива типа byte, получающего выводимые данные.

 



Поделиться:


Последнее изменение этой страницы: 2021-05-11; просмотров: 40; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.95.38 (0.005 с.)