Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5678 / 802 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 11:

Ввод/вывод

Аннотация: Применительно к обсуждаемым проблемам ввода/вывода в программах на C#, поток – это последовательность байтов, связанная с конкретными устройствами компьютера (дисками, дисплеями, принтерами, клавиатурами) посредством системы ввода/вывода. Подробнее о потоках - в этой лекции

В общем случае понятие ПОТОК — это абстрактное понятие, которое обозначает динамическую изменяющуюся во времени последовательность чего-либо.

Применительно к обсуждаемым проблемам ввода/вывода в программах на C#, поток – это последовательность байтов, связанная с конкретными устройствами компьютера (дисками, дисплеями, принтерами, клавиатурами) посредством системы ввода/вывода.

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

Функции, обеспечивающие взаимодействие с различными устройствами ввода/вывода, объявляются в различных классах. Вопрос "ОТКУДА ВЫЗВАТЬ функцию" часто становится более важным, чем вопрос "КАК ПОСТРОИТЬ выражение вызова функции".

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

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

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

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

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

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

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

kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2