Иллюстрированный самоучитель по Visual Basic .NET

Потоки данных

Как упоминалось во вступительной части, одной из целей проектирования класса System.IO.Stream было абстрагирование примитивных операций при работе с потоками байтов. В соответствий с этой концепцией каждая конкретная реализация класса Stream должна предоставить свои версии следующих методов:

  1. Read – метод чтения данных из потока. Иногда сводится к простейшему чтению одного байта, но во многих производных классах используются сложные методы для чтения данных большими порциями.
  2. Write – метод записи данных в поток. Как и предыдущий метод, может сводиться к простейшей записи одного байта, но может задействовать и фрагменты данных большего размера.

Впрочем, этим возможности не ограничиваются. Кроме простого перемещения от первого байта к последнему реализация класса Stream может поддерживать и другие способы – например, перемещение в обратном направлении или непосредственный переход к заданной позиции в потоке. Такое возможно для файловых потоков, но не имеет смысла (а следовательно, и не реализуется) для потоков, основанных на сетевых соединениях. Свойство CanSeek позволяет узнать, поддерживает ли поток произвольный доступ. Если свойство равно True, значит, в производном классе поддерживаются реализации методов Seek и SetLength, а также свойств Position и Length.

Примечание
В реализации метода Seek обычно используются три значения (Begin, Current и End), входящие в удобный перечисляемый тип SeekOrigin
.

В табл. 9.7 перечислены основные методы абстрактного класса Stream, смысл которых должен сохраниться и в производных классах.

Таблица 9.7. Основные методы класса Stream.

Метод/свойство Описание
CanRead (свойство) Логический признак поддержки чтения
CanSeek (свойство) Логический признак поддержки произвольного доступа (позиционирования)
CanWrite (свойство) Логический признак поддержки записи
Length (свойство) Длина потока в байтах
Position (свойство) Позиция в текущем потоке (тип Long). Свойство доступно для чтения, а в некоторых потоках – и для записи
Close Закрывает поток и освобождает используемые ресурсы (например, файловые манипуляторы операционной системы)
Flush Записывает данные и стирает содержимое всех буферов, используемых потоком
Read(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) Читает заданное количество байтов начиная с текущей позиции с прибавлением заданного смещения offset. Возвращает количество успешно прочитанных байтов
Read Byte Читает отдельный байт (почему-то в формате Integer) в текущей позиции потока. Если текущая позиция находится в конце потока, возвращает – 1
Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) Записывает заданное количество байтов начиная с текущей позиции с прибавлением заданного смещения offset
WriteByte(ByVal value As Byte) Записывает байт в текущую позицию потока
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.