Как упоминалось во вступительной части, одной из целей проектирования класса System. I0.Stream было абстрагирование примитивных операций при работе с потоками байтов. В соответствий с этой концепцией каждая конкретная реализация класса Stream должна предоставить свои версии следующих методов:
Впрочем, этим возможности не ограничиваются. Кроме простого перемещения от первого байта к последнему реализация класса Stream может поддерживать и другие способы — например, перемещение в обратном направлении или непосредственный переход к заданной позиции в потоке. Такое возможно для файловых потоков, но не имеет смысла (а следовательно, и не реализуется) для потоков, основанных на сетевых соединениях. Свойство CanSeek позволяет узнать, поддерживает ли поток произвольный доступ. Если свойство равно True, значит, в производном классе поддерживаются реализации методов Seek и SetLength, а также свойств Position и Length.
В табл. 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) |
Записывает байт в текущую позицию потока | ||||
Класс |
Описание |
||
| FileStream | Произвольный доступ к файлам | ||
| MemoryStream | Представляет блок памяти (часто используется при работе с буферами) | ||
| NetworkStream | Данные, полученные в виде потока по сетевому соединению. Принадлежит пространству имен System. Net. Sockets | ||
| CryptoStream | Шифровка и расшифровка данных. Принадлежит пространству имен System. Security. Cryptography | ||
| BufferedStream | «Оболочка» для поддержки буферизации в потоках, не обладающих этой возможностью (при использовании позволяет задать размер буфера). Например, автоматическая буферизация ввода используется в файловых потоках, но отсутствует в сетевых потоках. Если потребуется организовать буферизацию для сетевого потока, воспользуйтесь классом BufferedStream и методикой, описанной далее в этой главе | ||