русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Потоки: байтовые, символьные, двоичные


Дата добавления: 2015-07-09; просмотров: 1307; Нарушение авторских прав


Большинство устройств, предназначенных для выполнения операций ввода-вывода, являются байт-ориентированными. Этим и объясняется тот факт, что на самом низком уровне все операции ввода-вывода манипулируют с байтами в рамках байтовых потоков.

С другой стороны, значительный объём работ, для которых, собственно и используется вычислительная техника, предполагает работу с символами, а не с байтами (заполнение экранной формы, вывод информации в наглядном и легко читаемом виде, текстовые редакторы).

Символьно-ориентированные потоки, предназначенные для манипулирования с символами, а не с байтами, являются потоками ввода-вывода более высокого уровня. В рамках Framework.NET определены соответствующие классы, которые при реализации операций ввода-вывода обеспечивают автоматическое преобразование данных типа byte в данные типа char и обратно.

В дополнение к байтовым и символьным потокам в C# определены два класса, реализующих механизмы считывания и записи информации непосредственно в двоичном представлении (потоки BynaryReader и BynaryWriter).

Общая характеристика классов потоков

Основные особенности и правила работы с устройствами ввода-вывода в современных языках высокого уровня описываются в рамках классов потоков. Для языков платформы .NET местом описания самых общих свойств потоков является класс System.IO.Stream.

Назначение этого класса заключается в объявлении общего стандартного набора операций (стандартного интерфейса), обеспечивающих работу с устройствами ввода-вывода, независимо от их конкретной реализации источников и получателей информации.

Процедуры чтения и записи информации определяется следующим (список неполон!) набором свойств и АБСТРАКТНЫХ методов, объявляемых в этом классе.

Здесь и ниже понятие АБСТРАКТНЫЙ означает отсутствие КОНКРЕТНОЙ реализации данного метода (об этом позже!). Классы, содержащие абстрактные методы, также называются абстрактными. Основная задача абстрактного класса – задать план для построения, общее направление реализации конкретных (неабстрактных) классов.



 

В рамках Framework.NET, независимо от характеристик того или иного устройства ввода-вывода, программист ВСЕГДА может узнать:

§ можно ли читать из потока – bool CanRead (если можно – значение должно быть установлено в true),

§ можно ли писать в поток – bool CanWrite (если можно – значение должно быть установлено в true),

§ можно ли задать в потоке текущую позицию – bool CanSeek (если последовательность, в которой производится чтение-запись не является жёстко детерминированной и возможно позиционирование в потоке - значение должно быть установлено в true),

§ позицию текущего элемента потока – long Position (возможность позиционирования в потоке предполагает возможность программного изменения значения этого свойства),

§ общее количество символов потока (длину потока) – long Length.

 

В соответствии с общими принципами реализации операций ввода-вывода, для потока предусмотрен набор методов, позволяющих реализовать:

§ чтение байта из потока с возвращением целочисленного представления СЛЕДУЮЩЕГО ДОСТУПНОГО байта в потоке ввода – int ReadByte(),

§ чтение определённого (count) количества байтов из потока и размещение их в массиве buff, начиная с элемента buff[index], с возвращением количества успешно прочитанных байтов – int Read(byte[] buff, int index, int count),

§ запись в поток одного байта – void WriteByte(byte b),

§ запись в поток определённого (count) количества байтов из массива buff, начиная с элемента buff[index], с возвращением количества успешно записанных байтов – int Write(byte[] buff, int index, int count),

§ позиционирование в потоке – long Seek (long index, SeekOrigin origin) (позиция текущего байта в потоке задаётся значением смещения index относительно позиции origin),

§ для буферизованных потоков принципиальна операция флэширования (записи содержимого буфера потока на физическое устройство) – void Flush(),

§ закрытие потока – void Close().

 

Множество классов потоков ввода-вывода в Framework.NET основывается (наследует свойства и интерфейсы) на абстрактном классе Stream. При этом классы конкретных потоков обеспечивают собственную реализацию интерфейсов этого абстрактного класса.

Наследниками класса Stream являются, в частности, три класса байтовых потоков:

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

§ FileStream – байтовый поток, обеспечивающий файловые операции ввода-вывода,

§ MemoryStream – байтовый поток, использующий в качестве источника и хранилища информации оперативную память.

Манипуляции с потоками предполагают НАПРАВЛЕННОСТЬ производимых действий. Информацию из потока можно ПРОЧИТАТЬ, а можно её в поток ЗАПИСАТЬ. Как чтение, так и запись, предполагают реализацию определённых механизмов байтового обмена с устройствами ввода-вывода.

Свойства и методы, объявляемые в соответствующих классах, определяют специфику потоков, используемых для чтения и записи:

§ TextReader,

§ TextWriter.

 

Эти классы являются абстрактными. Это означает, что они не “привязаны” ни к какому конкретному потоку. Они лишь определяют интерфейс (набор методов), который позволяет организовать чтение и запись информации для любого потока.

В частности, в этих классах определены следующие методы, определяющие базовые механизмы символьного ввода-вывода. Для класса TextReader:

§ int Peek() - Reads the next character without changing the state of the reader or the character source. Returns the next available character without actually reading it from the input stream.

§ int Read(…) - Overloaded. Несколько одноименных функций с одним и тем же именем. Читает значения из входного потока. Вариант int Read() предполагает чтение из потока одного символа с возвращением его целочисленного эквивалента или -1 при достижении конца потока. Вариант int Read (char[] buff, int index, int count) и его полный аналог int ReadBlock(char[] buff, int index, int count) обеспечивает прочтение a maximum of count characters из текущего потока и записывает данные в buffer, начиная at index.

§ string ReadLine() – Читает строку символов из текущего потока. Возвращается ссылка на объект типа string.

§ string ReadToEnd() – Читает все символы, начиная с текущей позициисимвольного потока, определяемого объектом класса TextReader и возвращает результат как ссылка на объект типа string.

§ void Close() – Закрывает поток ввода.

 

Для класса TextWriter, в свою очередь, определяется:

§ множество перегруженных вариантов функции void Write(…) со значениями параметров, позволяющих записывать символьное представление значений базовых типов (смотреть список базовых типов) и массивов значений (в том числе и массивов строк).

§ void Flush() - Clears all buffers for the current writer and causes any buffered data to be written to the underlying stream. Очистка буфера вывода с предварительным выводом в поток вывода (носитель данных) содержимого буфера.

§ void Close() – Закрывает поток вывода.

 

Эти классы являются базовыми для классов:

§ StreamReader – содержит свойства и методы, обеспечивающие считывание СИМВОЛОВ из байтового потока,

§ StreamWriter – содержит свойства и методы, обеспечивающие запись СИМВОЛОВ в байтовый поток.

Вышеуказанные классы включают методы своих “предков” и позволяют реализовать процессы чтения-записи непосредственно из конкретных байтовых потоков. Работа по организации ввода-вывода с использованием этих классов предполагает определение соответствующих объектов, “ответственных” за реализацию операций ввода-вывода с явным указанием потоков, которые предполагается при этом использовать.

Ещё одна пара классов потоков обеспечивает механизмы символьного ввода-вывода для строк:

§ StringReader,

§ StringWriter.

 

В этом случае источником и хранилищем множества символов является символьная строка.

Интересно заметить, что у всех ранее перечисленных классов имеются методы, обеспечивающие закрытие потоков и не определены методы обеспечивающие открытие соответствующего потока. Потоки открываются в момент создания объекта-представителя соответствующего класса. Наличие функции, обеспечивающей явное закрытие потока принципиально. Оно связано с особенностями выполнения управляемых модулей в Framework.NET. Время начала работы сборщика мусора заранее неизвестно.



<== предыдущая лекция | следующая лекция ==>
Динамическая сборка: создание, сохранение, загрузка, выполнение | Предопределённые потоки ввода-вывода


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.504 сек.