Видеть так много идентичных, на первый взгляд, подходов к реализации ввода-вывода, может быть, немного странно, но имейте в виду, что конечным результатом здесь оказывается гибкость. Так или иначе, вы смогли увидеть, как можно извлекать символьные данные из файлов и помещать их в файлы, используя типы StreamWriter и StreamReader, и теперь мы с вами можем рассмотреть роль классов StringWriter и StringReader.
Исходный код. Проект StreamWriterReaderApp размещен в подкаталоге, соответствующем главе 16.
Работа с типами StringWriter и StringReader
Используя типы StringWriter и StringReader, вы можете обращаться с текстовой информацией, как с потоком символов в памяти. Это может оказаться полезным тогда, когда необходимо добавить символьную информацию в соответствующий буфер. В следующем примере блок строковых данных записывается в объект StringWriter, а не в файл на локальном жестком диске.
static void Main(string[] args) {
Console.WriteLine("*** Забавы с StringWriter/StringReader ***\n");
// Создание StringWriter и вывод символьных данных в память.
StringWriter strWriter = new StringWriter();
strWriter.WriteLine("He забыть о дне рождения мамы…");
strWriter.Close();
// Получение копии содержимого (сохраненного в строке) и
// вывод на консоль.
Console.WriteLine("Содержимое StringWriter:\n{0}", strWriter);
}
Ввиду того, что и StringWriter, и StreamWriter получаются из одного и того же базового класса (TextWriter), для них используется приблизительно одинаковая программная логика записи. Однако ввиду самой своей природы, класс StringWriter позволяет извлечь объект System.Text.StringBuilder с помощью метода GetStringBuilder().
static void Main(string[] args) {
Соnsоlе.WriteLine("*** Забавы с StringWriter/StringReader ***\n'');
…
// Создание StringWriter и вывод символьных данных в память.
StringWriter strWriter = new StringWriter();
…
// Получение внутреннего StringBuilder.
StringBuilder sb = strWriter.GetStringBuilder();
sb.Insert(0, "Эй!! ");
Console.WriteLine("-› {0}", sb.ToString());
sb.Remove(0, "Эй!! ".Length);
Console.WriteLine("-› {0}", sb.ToString());
}
Чтобы прочитать данные из символьного потока, используйте соответствующий тип StringReader, который (в соответствии с ожиданиями) функционирует так же, как и родственный ему класс StreamReader. Фактически класс StringReader просто переопределяет наследуемые члены, чтобы обеспечить чтение из блока символьных данных, а не из файла.
static void Main(string[] args) {
Console.WriteLine("*** Забавы с StringWriter/StringReader ***\n");
// Создание StringWriter и вывод символьных данных в память.
StringWriter strWriter = new StringWriter();
…
// Чтение данных из StringWriter.
StringReader strReader = new StringReader(writer.ToString());
string input = null;
while ((input = strReader.ReadLine()) != null) {
Console.WriteLine(input);
}
strReader.Close();
}
Исходный код. Проект StringWriterReaderApp размещен в подкаталоге, соответствующем главе 16.
Работа с BinaryWriter и BinaryReader
И последним из рассмотренных здесь средств чтения/записи будут BinaryReader и BinaryWriter, которые получаются непосредственно из System.Object. Эти типы позволяют читать и записывать дискретные
Таблица 16.9. Основные члены BinaryWriter