writer.WriteLine("Don't forget Father's Day this year...");
writer.WriteLine("Don't forget these numbers:");
for(int i = 0; i < 10; i++)
{
writer.Write(i + " ");
}
// Вставить новую строку.
writer.Write(writer.NewLine);
}
Console.WriteLine("Created file and wrote some thoughts...");
Console.ReadLine;
//File.Delete("reminders.txt");
После
выполнения программы можете просмотреть содержимое созданного файла, который будет находиться в корневом каталоге проекта (Visual Studio Code) или в подкаталоге
bin\Debug\net5.0
(Visual Studio). Причина в том, что при вызове
CreateText
вы не указали абсолютный путь, а стандартным местоположением является текущий каталог выполнения сборки.
Чтение из текстового файла
Далее вы научитесь программно читать данные из файла, используя соответствующий тип
StreamReader
. Вспомните, что
StreamReader
является производным от абстрактного класса
TextReader
, который предлагает функциональность, описанную в табл. 20.9.
Расширьте текущий пример приложения с целью применения класса
StreamReader
, чтобы в нем можно было читать текстовые данные из файла
reminders.txt
:
Console.WriteLine("***** Fun with StreamWriter/StreamReader *****\n");
...
// Прочитать данные из файла.
Console.WriteLine("Here are your thoughts:\n");
using(StreamReader sr = File.OpenText("reminders.txt"))
{
string input = null;
while ((input = sr.ReadLine) != null)
{
Console.WriteLine (input);
}
}
Console.ReadLine;
После запуска программы в окне консоли отобразятся символьные данные из файла
reminders.txt
.
Прямое создание объектов типа StreamWriter/StreamReader
Один из запутывающих аспектов работы с типами пространства имен
System.IO
связан с тем, что идентичных результатов часто можно добиться с использованием разных подходов. Например, ранее вы уже видели, что метод
CreateText
позволяет получить объект
StreamWriter
с типом
File
или
FileInfo
. Вообще говоря, есть еще один способ работы с объектами
StreamWriter
и
StreamReader
: создание их напрямую. Скажем, текущее приложение можно было бы переделать следующим образом:
Console.WriteLine("***** Fun with StreamWriter/StreamReader *****\n");
// Получить объект StreamWriter и записать строковые данные.
using(StreamWriter writer = new StreamWriter("reminders.txt"))
{
...
}
//
Прочитать данные из файла.
using(StreamReader sr = new StreamReader("reminders.txt"))
{
...
}
Несмотря на то что существование такого количества на первый взгляд одинаковых подходов к файловому вводу-выводу может сбивать с толку, имейте в виду,что конечным результатом является высокая гибкость. Теперь, когда вам известно, как перемещать символьные данные в файл и из файла с применением классов
StreamWriter
и
StreamReader
, давайте займемся исследованием роли классов
StringWriter
и
StringReader
.
Работа с типами StringWriter и StringReader
Классы
StringWriter
и
StringReader
можно использовать для трактовки текстовой информации как потока символов в памяти. Это определенно может быть полезно, когда нужно добавить символьную информацию к лежащему в основе буферу. Для иллюстрации в следующем проекте консольного приложения (
StringReaderWriterApp
) блок строковых данных записывается в объект
StringWriter
вместо файла на локальном жестком диске (не забудьте импортировать пространства имен
System.IO
и
System.Text
):
using System;
using System.IO;
using System.Text;
Console.WriteLine("***** Fun with StringWriter/StringReader *****\n");
// Создать объект StringWriter и записать символьные данные в память.
using(StringWriter strWriter = new StringWriter)
{
strWriter.WriteLine("Don't forget Mother's Day this year...");
// Получить копию содержимого (хранящегося в строке) и вывести на консоль.
Console.WriteLine("Contents of StringWriter:\n{0}", strWriter);
}
Console.ReadLine;
Классы
StringWriter
и
StreamWriter
порождены от одного и того же базового класса (
TextWriter
), поэтому логика записи похожа. Тем не менее, с учетом природы
StringWriter
вы должны также знать, что данный класс позволяет применять метод
GetStringBuilder
для извлечения объекта
System.Text.StringBuilder
:
using (StringWriter strWriter = new StringWriter)
{
strWriter.WriteLine("Don't forget Mother's Day this year...");
Console.WriteLine("Contents of StringWriter:\n{0}", strWriter);