- •Лабораторная работа №3. Ввод, вывод и сериализация объектов
- •1. Цель работы
- •2. Сведения из теории
- •2.1. Пространство имен System.Io
- •2.2. Классы потоков
- •2.3. Текстовые файлы
- •2.4. Двоичные файлы
- •2.5. Сериализация объектов
- •3. Пример выполнения работы
- •3.1. Визуальное проектирование диалогового окна
- •3.2. Проектирование программного кода
- •4. Задание для самостоятельной работы
2.3. Текстовые файлы
Несмотря на то, что байтовая обработка данных получила широкое распространение, C# также поддерживает работу с символьными потоками, а, следовательно, с текстовыми файлами. Символьные потоки работают непосредственно с Unicode-символами. В общем случае, чтобы выполнять файловые операции с текстом, нужно поместить объект класса FileStream внутрь объекта класса StreamReader или класса StreamWriter. Эти классы автоматически преобразуют байтовый поток в символьный и наоборот. Иерархия классов, предназначенных для работы с текстовыми файлами, приведена на рисунке 4.2.
Рис. 4.2. Иерархия классов работы с текстовыми файлами
В классах StreamWriter и StreamReader определено несколько конструкторов. Чаще всего используются следующий формат:
StreamWriter(Stream stream)
StreamReader(Stream stream)
Здесь элемен stream означает имя открытого потока. Эти конструкторы генерируют исключения типа ArgumentException, если поток stream не открыт для вывода или ввода соответственно, и исключение типа ArgumentNullException, если он (поток) имеет null-значение. Созданные объекты автоматически выполняют преобразование символов в байты или наоборот.
Иногда удобнее открывать файл с помощью классов StreamWriter и StreamReader. Для этого используются следующие конструкторы:
StreamWriter(string filename)
StreamReader(string filename)
Здесь элемент filename означает имя открываемого файла, причем имя может включать полный путь к файлу.
Значительная часть функциональных возможностей класса StreamWriter обеспечивается при помощи компонентов, унаследованных от TextWriter. Эти компоненты представлены в таблице:
Компонент |
Описание |
Методы | |
virtual void Close() |
Закрывает соответствующий объект Writer |
virtual void Flush() |
Очищает все буферы для текущего объекта Writer и записывает накопленные в них данные в место их постоянного хранения, но при этом сам объект Writer не закрывается |
virtual void Write(...) |
Перегруженный метод. Записывает данные требуемого типа в текстовом формате в поток без перевода строки |
virtual void WriteLine(...) |
Перегруженный метод. Записывает данные требуемого типа в текстовом формате в поток с переводом строки |
Свойство | |
virtual string NewLine |
Получает или устанавливает последовательность символов, означающих начало новой строки. По умолчанию - \r\n |
Соответственно, большинство компонентов класса StreamReader для чтения из текстового файла унаследовано от класса TextReader:
Методы |
Описание |
virtual void Close() |
Закрывает соответствующий объект Reader |
virtual int Peek() |
Возвращает следующий символ, не изменяя позицию указателя в файле |
virtual int Read() |
Считывает данные из потока на входе |
virtual int ReadBlock (char[] buffer, int index, int count) |
Считывает count символов, начиная с позиции index, и записывает считанные данные в буфер buffer |
virtual string ReadLine() |
Считывает строку данных из текущего потока. Пустая строка (null string) означает конец файла (EOF) |
virtual string ReadToEnd() |
Считывает все символы с текущей позиции до конца потока |