Таблица 14.1. Некоторые методы, определенные в классе stream
Метод Описание
void Close()- Закрывает поток
void Flush()- Выводит содержимое потока на физическое устройство
int ReadByte()- Возвращает целочисленное представление следующего байта, доступного для ввода из потока. При обнаружении конца файла возвращает значение -1
int Read(byte[] buffer, int offset, int count)- Делает попытку ввести count байтов в массив
buffer, начиная с элемента buffer[offset]. Возвращает количество успешно введенных байтов
long Seek(long offset, SeekOrigin origin)- Устанавливает текущее положение в потоке по указан
ному смещению offset относительно заданного начала отсчета origin. Возвращает новое положение в потоке
void WriteByte(byte value)- Выводит один байт в поток вывода
void Write(byte[] buffer, int offset, int count)- Выводит подмножество count байтов из массива buffer, начиная с элемента buffer[offset]. Воз вращает количество выведенных байтов
Некоторые из методов, перечисленных в табл. 14.1, генерируют исключение IOExceptionпри появлении ошибки ввода-вывода. Если же предпринимается попытка выполнить неверную операцию, например вывести данные в поток, предназначенный только для чтения, то генерируется исключение NotSupportedException. Кроме того, могут быть сгенерированы и другие исключения — все зависит от конкретного метода.
Следует заметить, что в классе Streamопределены методы для ввода (или чтения) и вывода (или записи) данных. Но не все потоки поддерживают обе эти операции, поскольку поток можно открывать только для чтения или только для записи. Кроме того, не все потоки поддерживают запрос текущего положения в потоке с помощью метода Seek(). Для того чтобы определить возможности потока, придется воспользоваться одним, а то и несколькими свойствами класса Stream. Эти свойства перечислены в табл. 14.2 наряду со свойствами Lengthи Position, содержащими длину потока и текущее положение в нем.
Таблица 14.2. Свойства, определенные в классе Stream
Свойство Описание
bool CanRead- Принимает значение true, если из потока можно ввести данные. Доступно только для чтения
bool CanSeek- Принимает значение true, если поток поддерживает запрос текущего положения в потоке. Доступно только для чтения
bool CanWrite- Принимает значение true, если в поток можно вывести данные. Доступно только для чтения
long Length- Содержит длину потока. Доступно только для чтения
long Position- Представляет текущее положение в потоке. Доступно как для чтения, так и для записи
int ReadTimeout- Представляет продолжительность времени ожидания в операциях ввода. Доступно как для чтения, так и для записи
int WriteTimeout- Представляет продолжительность времени ожидания в операциях - вывода. Доступно как для чтения, так и для записи
Классы байтовых потоков
Производными от класса Streamявляются несколько конкретных классов байтовых потоков. Эти классы определены в пространстве имен System.IOи перечислены ниже.
Класс потока Описание
BufferedStream- Заключает в оболочку байтовый поток и добавляет буферизацию. Буферизация, как правило, повышает производительность
FileStream- Байтовый поток, предназначенный для файлового ввода-вывода
MemoryStream- Байтовый поток, использующий память для хранения данных
UnmanagedMemoryStream- Байтовый поток, использующий неуправляемую память для хранения данных
В среде NET Framework поддерживается также ряд других конкретных классов потоков, в том числе для ввода-вывода в сжатые файлы, сокеты и каналы. Кроме того, можно создать свои собственные производные классы потоков, хотя для подавляющего числа приложений достаточно и встроенных потоков.
Классы-оболочки символьных потоков
Для создания символьного потока достаточно заключить байтовый поток в один из классов-оболочек символьных потоков. На вершине иерархии классов символьных потоков находятся абстрактные классы TextReaderи TextWriter. Так, класс TextReaderорганизует ввод, а класс TextWriter— вывод. Методы, определенные в обоих этих классах, доступны для всех их подклассов. Они образуют минимальный набор функций ввода-вывода, которыми должны обладать все символьные потоки.
В табл. 14.3 перечислены методы ввода, определенные в классе TextReader. В целом, эти методы способны генерировать исключение IOExceptionпри появлении ошибки ввода, а некоторые из них — исключения других типов. Особый интерес вызывает метод ReadLine(), предназначенный для ввода целой текстовой строки, возвращая ее в виде объекта типа string. Этот метод удобен для чтения входных данных, содержащих пробелы. В классе TextReaderимеется также метод Close(), определяемый следующим образом.
Читать дальше