Под файлом обычно подразумевается именованная информация на внешнем носителе, например на жестком или гибком магнитном диске. Логически файл можно представить как конечное количество последовательных байтов, поэтому такие устройства, как дисплей, клавиатура и принтер, также можно рассматривать как частные случаи файлов.
Передача данных с внешнего устройства в оперативную память называется чтением, или вводом, обратный процесс — записью, или выводом. Ввод-вывод в С# выполняется с помощью подсистемы ввода-вывода и классов библиотеки.NET. В этой главе рассматривается обмен данными с файлами и их частным случаем — консолью. Обмен данными реализуется с помощью потоков.
Поток (stream)1 - это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику.
1 Не путать с потоком выполнения, описанным в предыдущей главе. Впрочем, и в обычной речи мы часто обозначаем одним и тем же словом совершенно разные вещи!
Потоки обеспечивают надежную работу как со стандартными, так и с определенными пользователем типами данных, а также единообразный и понятный синтаксис. Поток определяется как последовательность байтов и не зависит от конкретного устройства, с которым производится обмен (оперативная память, файл на диске, клавиатура или принтер). Обмен с потоком для повышения скорости передачи данных производится, как правило, через специальную область оперативной памяти — буфер. Буфер выделяется для каждого открытого файла. При записи в файл вся информация сначала направляется в буфер и там накапливается до тех пор, пока весь буфер не заполнится. Только после этого или после специальной команды сброса происходит передача данных на внешнее устройство. При чтении из файла данные вначале считываются в буфер, причем не столько, сколько запрашивается, а сколько помещается в буфер.
|
|
Механизм буферизации позволяет более быстро и эффективно обмениваться информацией с внешними устройствами.
Рис. 11.1. Классы библиотеки.NET для работы с потоками
Классы библиотеки позволяют работать в различных режимах с файлами, каталогами и областями оперативной памяти. Краткое описание классов приведено в табл. 11.1.
Таблица 11.1. Основные классы пространства имен System.IO
Класс Описание
BinaryReader, Чтение и запись значений простых встроенных типов
BinaryWriter (целочисленных, логических, строковых и т. п.) во внутренней форме
представления Временное хранение потока байтов (например, для
последующего переноса в постоянное хранилище)
Directory, Работа с каталогами или физическими файлами: создание, удаление,
DirectoryInfo, File, получение свойств. Возможности классов File и Directory реализованы в
|
|
основном в виде статических методов. Аналогичные классы DirectoryInfo и
FileInfo используют обычные методы
FileStream Произвольный (прямой) доступ к файлу, представленному как поток байтов
MemoryStream Произвольный доступ к потоку байтов в оперативной памяти
StreamWriter, Чтение из файлаи запись в файл текстовой информации
StreamReader (произвольный доступ не поддерживается)
StringWriter, Работа с текстовой информацией в оперативной памяти