Как можно видеть из таблицы, выполнять обмен с внешними устройствами можно на уровне:
□ двоичного представления данных (BinaryReader, BinaryWriter);
□ байтов (FiIeStream);
□ текста, то есть символов (StreamWriter, StreamReader).
В.NET используется кодировка Unicode, в которой каждый символ кодируется двумя байтами. Классы, работающие с текстом, являются оболочками классов, использующих байты, и автоматически выполняют перекодирование из байтов в символы и обратно.
Двоичные и байтовые потоки хранят данные в том же виде, в котором они представлены в оперативной памяти, то есть при обмене с файлом происходит побитовое копирование информации. Двоичные файлы применяются не для просмотра их человеком, а для использования в программах.
Доступ к файлам может быть последовательным, когда очередной элемент можно прочитать (записать) только после аналогичной операции с предыдущим элементом, и произвольным, или прямым, при котором выполняется чтение (запись) произвольного элемента по заданному адресу. Текстовые файлы позволяют выполнять только последовательный доступ, в двоичных и байтовых потоках можно использовать оба метода.
Прямой доступ в сочетании с отсутствием преобразований обеспечивает высокую скорость получения нужной информации.
ПРИМЕЧАНИЕ
Методы форматированного ввода, с помощью которых можно выполнять ввод с клавиатуры или из текстового файла значений арифметических типов, в С# не поддерживаются. Для преобразования из символьного в числовое представление используются методы класса Convert или метод Parse, рассмотренные в разделе «Простейший ввод-вывод» (см. с. 59).
ПРИМЕЧАНИЕ
Форматированный вывод, то есть преобразование из внутренней формы представления числа в символьную, понятную человеку, выполняется с помощью перегруженных методов ToString, результаты выполнения которых передаются в методы текстовых файлов.
Помимо перечисленных классов в библиотеке.NET есть классы XmlTextReader и XmlTextWriter, предназначенные для формирования и чтения кода в формате XML. Понятие об XML дается в главе 15.
Рассмотрим простейшие способы работы с файловыми потоками. Использование классов файловых потоков в программе предполагает следующие операции:
1. Создание потока и связывание его с физическим файлом.
2. Обмен (ввод-вывод).
3. Закрытие файла.
Каждый класс файловых потоков содержит несколько вариантов конструкторов, с помощью которых можно создавать объекты этих классов различными способами и в различных режимах.
Например, файлы можно открывать только для чтения, только для записи или для чтения и записи. Эти режимы доступа к файлу содержатся в перечислении FileAccess, определенном в пространстве имен System.IO. Константы перечисления приведены в табл. 11.2.
Таблица 11.2. Значения перечисления FileAccess
Значение Описание
Read Открыть файл только для чтения
ReadWrite Открыть файл для чтения и записи
Write Открыть файл только для записи
Таблица 11.3. Значения перечисления FileMode
Значение Описание
Append Открыть файл, если он существует, и установить текущий указательв конец
файла. Если файл не существует, создать новый файл
Create Создать новый файл. Если в каталоге уже существует файл с таким же именем, он
будет стерт
CreateNew Создать новый файл. Если в каталоге уже существует файл с таким же именем,
возникает исключение IOException
Open Открыть существующий файл
OpenOrCreate Открыть файл, если он существует. Если нет, создать файл с таким именем
Truncate Открыть существующий файл. После открытия он должен быть обрезан до
нулевой длины
Режим FileMode.Append можно использовать только совместно с доступом типа FileAccess.Write, то есть для файлов, открываемых для записи.
Таблица 11.4. Значения перечисления FileShare