4.2 Работа с текстовыми файлами
Хотя рассмотренные в предыдущем разделе потоки FileStream,BinaryWriterиBinaryReaderможно использовать для записи в файлы и чтения из файлов текстовых строк, лучше прменять специально предназначенные для этого средства. Речь идет о потоках классовStreamWriterиStreamReader. Эти потоки чрезвычайно просты в использовании и удобны для работы с текстовыми файлами.
Основные приемы использования потоков StreamWriterиStreamReaderдемонстрируются в программе, исходный текст которой приведен ниже:
using System;
using System.IO;
namespace TextFile
{
class TextFileApp
{
private const string testFile = "mydata.txt";
static void Main(string[] args)
{
if (File.Exists(testFile))
{
Console.WriteLine("Файл {0} уже существует", testFile);
Console.ReadLine();
return;
}
StreamWriter sw = File.CreateText(testFile);
sw.WriteLine("Каждый охотник желает знать, где сидит фазан!");
sw.WriteLine("Число \"Пи\" равно примерно {0}.", 3.1415926);
sw.Close();
StreamReader sr = File.OpenText(testFile);
while (true)
{
String str = sr.ReadLine();
if (str == null)
break;
Console.WriteLine(str);
}
sr.Close();
Console.WriteLine("Файл успешно создан"); Console.ReadLine();
}
}
}
Программа сразу после запуска проверяет существование рабочего файла в текущем каталоге:
private const string testFile = "mydata.txt";
if (File.Exists(testFile))
{
Console.WriteLine("Файл {0} уже существует", testFile);
Console.ReadLine();
return;
}
Если файл с именем mydata.txtсуществует в текущем каталоге, программа завершает свою работу с сообщением об ошибке. В противном случае программа создает текстовый файл и открывает поток для работы с ним классаStreamWriter:
StreamWriter sw = File.CreateText(testFile);
Как видите, эта операция выполняется методом CreateText, определенным в классеFile. Аналогичного эффекта можно было бы достичь и с помощью следующего конструктора классаStreamWriter:
StreamWriter sw = new StreamWriter(testFile, false);
Первый параметр этого конструктора определяет полный путь к открываемому файлу. Если значение второго параметра равно true, новые данные будут добавлены к файлу, а еслиfalse- содержимое файла будет перезаписано.
Для открытия текстового файла на запись вы можете использовать любой из этих конструкторов. Заметим, что в классе StreamWriterимеются и другие конструкторы, позволяющие, например, задать кодировку текстовых символов, записываемых в файл.
После того как поток StreamWriterоткрыт, программа может записывать в него текстовые строки, пользуясь хорошо известными вам методамиWriteиWriteLine:
sw.WriteLine("Каждый охотник желает знать, где сидит фазан!");
sw.WriteLine("Число \"Пи\" равно примерно {0}.", 3.1415926);
Когда запись новых данных в поток завершена, необходимо закрыть поток методом Close:
sw.Close();
Теперь о чтении данных из текстового файла.
Прежде всего программа должна открыть поток класса StreamReader, привязав его к файлу. Это можно сделать методом File.OpenText:
StreamReader sr = File.OpenText(testFile);
Вы можете также открыть поток и привязать его к файлу с помощью конструктора класса StreamReader:
StreamReader sr = new StreamReader(testFile);
Далее наша программа считывает текстовые строки из файла, вызывая в цикле метод ReadLine:
while(true)
{
String str = sr.ReadLine();
if(str == null)
break;
Console.WriteLine(str);
}
Этот метод возвращает прочитанную строку или значение nullпри достижении конца файла.
После завершения работы с потоком StreamReaderего следует закрыть методомClose:
sr.Close();
Таким образом, наша программа записывает две строки в файл, а затем читает их оттуда и отображает на консоли.