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

       

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


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

  • Read — метод чтения данных из потока. Иногда сводится к простейшему чтению одного байта, но во многих производных классах используются сложные методы для чтения данных большими порциями.

  • 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)

    Записывает байт в текущую позицию потока

    <
    Все классы иерархии Stream поддерживают метод Close, освобождающий удерживаемые ресурсы операционной системы (например, файловые манипуляторы или сетевые соединения), поэтому практически во всех программах, работающих с потоками, рекомендуется закрывать поток в блоке Try-Catch-Final 1у. Учтите, что вызов Close в секции Finally требует предварительной проверки, поскольку этот метод вызывается лишь для существующих объектов потоков, созданных успешным вызовом конструктора. Проверка перед вызовом Close в секции Final ly выглядит примерно так:

    Finally

    If Not (myFileStream Is Nothing) Then myFileStream.Close()

    End Try

    Рассмотрите и такую возможность, как реализация IDisposable в классах, выполняющих операции с файлами, и закрытие всех открытых потоков методом Dispose.

    Основные классы, производные от Stream, перечислены в табл. 9.8.

    Таблица 9.8. Основные классы, производные от Stream



    Класс



    Описание

    FileStream Произвольный доступ к файлам
    MemoryStream Представляет блок памяти (часто используется при работе с буферами)
    NetworkStream Данные, полученные в виде потока по сетевому соединению. Принадлежит пространству имен System. Net. Sockets
    CryptoStream Шифровка и расшифровка данных. Принадлежит пространству имен System. Security. Cryptography
    BufferedStream «Оболочка» для поддержки буферизации в потоках, не обладающих этой возможностью (при использовании позволяет задать размер буфера). Например, автоматическая буферизация ввода используется в файловых потоках, но отсутствует в сетевых потоках. Если потребуется организовать буферизацию для сетевого потока, воспользуйтесь классом BufferedStream и методикой, описанной далее в этой главе
    В .NET Framework входят классы для работы с XML, спроектированные по образцу класса Stream. Впрочем, пространства имен XML в .NET велики и сложны, и о них вполне можно было бы написать отдельную книгу.




    Содержание раздела