- •1 Файлы и потоки
- •2 Потоки данных и классы
- •2.1 Стандартные потоки
- •2.2 Базовые классы для работы с файлами и потоками
- •2.2.1 Основные классы ввода и вывода
- •2.2.2 Классы на базе FileSystemInfo
- •2.2.3 Классы для работы с потоками
- •2.2.4 Классы для работы с потоками текстовых символов
- •2.3 Перечисления
- •3 Работа со стандартными потоками
- •3.1 Стандартный поток ввода
- •3.2 Стандартный поток вывода
- •3.2.1 Стандартный поток вывода сообщений об ошибках
- •3.3 Программа StdStreams
- •4 Создание потоков, связанных с файлами
- •4.1 Открытие потока FileStream
- •4.2 Открытие потоков BinaryWriter и BinaryReader
- •4.3 Закрытие потоков
- •4.4 Запись двоичных данных
- •4.5 Чтение двоичных данных
- •4.6 Программа Binary
- •4.7 Работа с текстовыми файлами
- •5 Выбор кодировки символов
- •5.1 Кодовые страницы
- •5.2 Недостатки модели кодовых страниц
- •5.3 Стандарт UNICODE
- •5.3.1 Unicode в Microsoft Windows NT/2000/XP
- •5.3.2 UNICODE в Microsoft Windows 95
- •5.4 Кодировка текстовых потоков
- •5.5 Кодировка текстовых строк в двоичных потоках
- •6 Буферизация потоков
- •6.1 Буферизация двоичных потоков
- •6.2 Буферизация текстовых потоков
- •6.3 Принудительный сброс буферов
- •7 Потоки в оперативной памяти
- •7.1 Создание потока
- •7.2 Чтение данных
- •7.3 Запись данных
- •7.4 Доступ к буферу потока MemoryStream
- •7.5 Потоки на базе строк string
- •7.6 Потоки класса StringBuilder
- •8 Краткие выводы
- •8.1 Создание и чтение бинарного файла
- •8.2 Создание текстового файла
- •8.3 Добавление в текстовый файл
- •8.4 Чтение и запись в файл строк на русском языке
- •8.5 Посимвольное чтение текстового файла
- •8.6 Построчное чтение текстового файла
- •8.7 Чтение файла полностью
2.2 Базовые классы для работы с файлами и потоками
Количество классов, созданных для работы с файлами, достаточно велико и может привести начинающего программиста в растерянность. Прежде чем мы займемся конкретными классами и приведем примеры приложений, работающих с потоками и файлами, рассмотрим иерархию классов, предназначенных для организации ввода и вывода.
2.2.1 Основные классы ввода и вывода
Как и все классы в С#, основные классы ввода и вывода произошли от класса Object (рис. 1).
BinaryReader
BinaryWriter
Object File
Directory
Path
Рисунок 1: Основные классы для работы с файлами и потоками
Рассмотрим кратко их назначение.
Класс BinaryReader предназначен для чтения блоков данных из потоков ввода на уровне отдельных байтов. Обычно для чтения объектов из файлов, таких, как строки и числа, программисты используют другие, более мощные классы.
Класс Binary Writer служит в качестве низкоуровневого средства записи данных в потоки вывода.
Класс File предназначен для работы с оглавлениями каталогов. С помощью статических методов этого класса можно получить список файлов и каталогов, расположенных в заданном каталоге, создать или удалить каталог, переименовать файл или каталог, а также выполнить некоторые другие операции.
С помощью статических методов класса Directory программа может получать списки каталогов и подкаталогов, создавать и удалять каталоги, а также выполнять над каталогами другие подобные операции.
Класс Path обеспечивает методы и свойства, с помощью которых программы могут работать с именами и полными путями каталогов.
2.2.2 Классы на базе FileSystemInfo
Рассмотренные в предыдущем разделе классы Directory и File содержат только
статические члены и потому предназначены для работы с файлами и каталогами без образования экземпляров соответствующих объектов.
Классы Directorylnfo и Filelnfo, напротив, требуют создания экземпляров объектов, представляющих соответственно каталоги и файлы. Эти классы унаследованы от общего абстрактного базового класса Filesystemlnfo, который, в свою очередь, является производным от абстрактного базового класса MarshalByRefObject (рис. 2).
Object
MarshalByRef
Object
FileSystemInfo
DirectoryInfo |
|
FileInfo |
|
|
|
Рисунок 2: Классы на базе FileSystemInfo
Абстрактный базовый класс MarshalByRefObj ect обеспечивает возможность доступа к объектам через границы доменов приложений, что необходимо в тех случаях, когда приложения выполняют удаленную обработку данных.
2.2.3 Классы для работы с потоками
На базе класса System.I0.Stream создано несколько производных классов, специально предназначенных для работы с потоками ввода и вывода (рис. 3).
Класс System.IO.Stream служит базовым для других классов потокового ввода и вывода.
Класс FileStream, как это видно из его названия, предназначен для работы с файлами через потоки ввода и вывода. Он обеспечивает позиционирование внутри
Object
MarshalByRefObject
System.IO.Stream
FileStream |
NetworkStream |
CryptodStream |
BufferedStream |
MemoryStream
Рисунок 3: Классы для работы с потоками
потоков ввода и вывода методом Seek. Это позволяет выполнять прямой доступ к файлам.
С помощью класса CryptoStream можно организовать ввод и вывод данных в зашифрованном виде.
Класс MemoryStream позволяет создавать файлы в оперативной памяти. Доступ к таким файлам осуществляется очень быстро, так как не требуется работать с медленными дисковыми устройствами. Обычно файлы в оперативной памяти создаются для временного хранения данных, потому что после выключения компьютера содержимое этих файлов исчезнет.
С помощью класса NetworkStream можно осуществлять удаленный ввод и вывод данных через сетевое соединение.
Класс BufferedStream обеспечивает буферизацию при работе с потоками ввода и вывода. Буферизация операций ввода и вывода в большинстве случаев значительно ускоряет работу приложений, так как при ее использовании сокращается количество обращений к системе для обмена данными с внешними устройствами.
2.2.4 Классы для работы с потоками текстовых символов
Специально для работы с потоками текстовых символов UNICODE в библиотеке классов Microsoft .NET Framework предусмотрены абстрактные классы System.IO.TextReader и System.IO.TextWriter. Первый из этих классов предназначен для потоков ввода, а второй — для потоков вывода (рис. 4).
С помощью класса StreamReader, базовым для которого является класс System.IO.TextReader, программа может читать отдельные байты входного потока символов.
Object
MarshalByRefObject
System.IO.TextReader |
|
|
|
|
|
System.IO.TextWriter |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StreamReader |
|
|
|
|
|
StreamWriter |
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StringReader |
|
|
|
|
|
StringWriter |
|
|
|
Рисунок 4: Классы для работы с потоками текстовых символов
Аналогично класс StreamWriter, созданный на базе класса System.IO.TextWriter, позволяет писать байты символов в выходной поток.
Классы StringReader и StringWriter, созданные на базе классов System.IO.TextReader и System.IO.TextWriter, соответственно предназначены для чтения и записи текстовых строк string.