Тип StreamReader получается из абстрактного типа TextReader. To же можно сказать и о родственном типе StringReader (он будет обсуждаться в этой главе позже). Базовый класс TextReader обеспечивает каждому из этих "последователей" очень небольшой набор функциональных возможностей, среди которых, в частности, возможность чтения символов из потока и их добавление в поток.
Тип StreamWriter (как и StringWriter, который также будет рассматриваться позже) получается из абстрактного базового класса TextWriter. Этот класс определяет члены, позволяющие производным типам записывать текстовые данные в имеющийся символьный поток. Взаимосвязь между этими новыми типами ввода-вывода показана на рис. 16.7.
Чтобы помочь вам понять возможности записи классов StreamWriter и StringWriter, в табл. 16.7 предлагаются описания основных членов абстрактного базового класса TextWriter.
Рис. 16.7. Читатели и писатели
Таблица 16.7.Основные члены TextWriter
| Член |
Описание |
| Close() |
Закрывает записывающий объект и освобождает связанные с ним ресурсы. При этом автоматически очищается буфер |
| Flush() |
Очищает все буферы текущего записывающего объекта с тем, чтобы все данные буфера были записаны на соответствующее устройство, но не закрывает сам записывающий объект |
| NewLine |
Указывает константу обрыва строки для производного класса записывающего объекта. По умолчанию признаком обрыва строки является возврат каретки с переходом на новую строку (\r\n) |
| Write() |
Записывает строку в текстовый поток без добавления константы обрыва строки |
| WriteLine() |
Записывает строку в текстовый поток с добавлением константы обрыва строки |
Замечание.Последние два из указанных в таблице членов класса TextWriter, вероятно, покажутся вам знакомыми. Если вы помните, у типа System.Console есть члены Write() и WriteLine(), записывающие текстовые данные в устройство стандартного вывода. На самом деле свойство Console.In является упаковкой для TextWriter, а свойство Console.Out – для TextReader.
Производный класс StreamWriter обеспечивает подходящую реализацию методов Write(), Close() и Flush() и определяет дополнительное свойство AutoFlush. Это свойство, когда его значение равно true (истина), заставляет StreamWriter при выполнении операции записи записывать все данные. Можно добиться лучшей производительности, если установить для AutoFlush значение false (ложь), поскольку иначе при каждой записи StreamWriter будет вызываться Close().
Рассмотрим пример работал с типом StreamWriter. Следующий класс создает новый файл reminders.txt с помощью метода File.CreateText(). С помощью полученного объекта StreamWriter в новый файл добавляются определенные текстовые данные, как показано ниже.
static void Main(string[] args) {
Console.WriteLine("*** Забавы с StreamWriter/StreamReader ***\n");
// Получение StreamWriter и запись строковых данных.
StreamWriter writer = File.CreateText("reminders.txt");
writer.WriteLine("Нe забыть о дне рождения мамы…");
writer.WriteLine("Не забыть о дне рождения папы…");
writer.WriteLine("Не забыть о следующих числах:");
for(int i = 0; i ‹ 10; i++) writer.Write(i + " ");
// вставка новой строки.
writer.Write(writer.NewLine);
// Закрытие автоматически влечет запись всех оставшихся данных!
writer.Close();
Console.WriteLine("Создан файл и записаны некоторые идеи…");
}
Выполнив эту программу, вы можете проверить содержимое нового файла (рис. 16.8).
Рис. 16.8. Содержимое вашего файла * .txt
Чтение из текстового файла
Теперь выясним, как программными средствами читать данные из файла, используя соответствующий тип StreamReader. Вы должны помнить, что этот класс получается из TextReader, функциональные возможности которого описаны в табл. 16.8.
Таблица 16.8. Основные члены TextReader
| Член |
Описание |
| Peek() |
Возвращает следующий доступный символ без фактического изменения позиции указателя считывающего объекта. Значение -1 указывает позицию, соответствующую концу потока |
| Read() |
Читает данные входного потока |
| ReadBlock() |
Читает максимальное заданное число символов текущего потока и записывает данные в буфер, начиная с указанного индекса |
| ReadLine() |
Читает строку символов из текущего потока и возвращает данные в виде строки (пустая строка указывает EOF – конец файла) |
| ReadToEnd() |
Читает все символы, начиная с текущей позиции и до конца потока, и возвращает их в виде одной строки |
Если теперь расширить имеющийся класс MyStreamWriter.Reader, чтобы использовать в нем StreamReader, вы сможете прочитать текстовые данные из файла reminders.txt, как показано ниже.
Читать дальше