Литмир - Электронная Библиотека
A
A

Запись в текстовый файл

Чтобы увидеть класс

StreamWriter
в действии, создайте новый проект консольного приложения по имени
StreamWriterReaderApp
и импортируйте пространства имен
System.IO
и
System.Text
. В показанном ниже коде с помощью метода
File.CreateText()
создается новый файл
reminders.txt
внутри текущего каталога выполнения. С применением полученного объекта
StreamWriter
в новый файл будут добавляться текстовые данные.

using System;

using System.IO;

using System.Text;

Console.WriteLine("***** Fun with StreamWriter / StreamReader *****\n");

<b>// Получить объект StreamWriter и записать строковые данные.</b>

using(StreamWriter writer = File.CreateText(&quot;reminders.txt&quot;))

{

  writer.WriteLine(&quot;Don't forget Mother's Day this year...&quot;);

  writer.WriteLine(&quot;Don't forget Father's Day this year...&quot;);

  writer.WriteLine(&quot;Don't forget these numbers:&quot;);

  for(int i = 0; i &lt; 10; i++)

  {

    writer.Write(i + &quot; &quot;);

  }

<b>  // Вставить новую строку.</b>

  writer.Write(writer.NewLine);

}

Console.WriteLine(&quot;Created file and wrote some thoughts...&quot;);

Console.ReadLine();

//File.Delete(&quot;reminders.txt&quot;);

После выполнения программы можете просмотреть содержимое созданного файла, который будет находиться в корневом каталоге проекта (Visual Studio Code) или в подкаталоге

bin\Debug\net5.0
(Visual Studio). Причина в том, что при вызове
CreateText()
вы не указали абсолютный путь, а стандартным местоположением является текущий каталог выполнения сборки.

Чтение из текстового файла

Далее вы научитесь программно читать данные из файла, используя соответствующий тип

StreamReader
. Вспомните, что
StreamReader
является производным от абстрактного класса
TextReader
, который предлагает функциональность, описанную в табл. 20.9.

Язык программирования C#9 и платформа .NET5 - _135.png

Расширьте текущий пример приложения с целью применения класса

StreamReader
, чтобы в нем можно было читать текстовые данные из файла
reminders.txt
:

Console.WriteLine(&quot;***** Fun with StreamWriter/StreamReader *****\n&quot;);

...

<b>// Прочитать данные из файла.</b>

Console.WriteLine(&quot;Here are your thoughts:\n&quot;);

using(StreamReader sr = File.OpenText(&quot;reminders.txt&quot;))

{

  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(&quot;***** Fun with StreamWriter/StreamReader *****\n&quot;);

<b>// Получить объект StreamWriter и записать строковые данные.</b>

using(StreamWriter writer = new StreamWriter(&quot;reminders.txt&quot;))

{

  ...

}

<b>// Прочитать данные из файла.</b>

using(StreamReader sr = new StreamReader(&quot;reminders.txt&quot;))

{

  ...

}

Несмотря на то что существование такого количества на первый взгляд одинаковых подходов к файловому вводу-выводу может сбивать с толку, имейте в виду,что конечным результатом является высокая гибкость. Теперь, когда вам известно, как перемещать символьные данные в файл и из файла с применением классов

StreamWriter
и
StreamReader
, давайте займемся исследованием роли классов
StringWriter
и
StringReader
.

Работа с типами StringWriter и StringReader

Классы

StringWriter
и
StringReader
можно использовать для трактовки текстовой информации как потока символов в памяти. Это определенно может быть полезно, когда нужно добавить символьную информацию к лежащему в основе буферу. Для иллюстрации в следующем проекте консольного приложения (
StringReaderWriterApp
) блок строковых данных записывается в объект
StringWriter
вместо файла на локальном жестком диске (не забудьте импортировать пространства имен
System.IO
и
System.Text
):

368
{"b":"847442","o":1}