Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЛИПО .doc
Скачиваний:
0
Добавлен:
06.12.2018
Размер:
441.86 Кб
Скачать

Текстовый ввод-вывод при помощи Stream Reader и Stream Writer

Классы StreamReader и StreamWriter специально разработаны, чтобы работать с символьными потоками. Эти потоки применимы только для текстовых файлов. Несколь­ко методов этих классов показаны далее.

Оба класса используют метод Close, закрывающий поток. Системные ресурсы, выделенные под него, освобождаются, доступ других потоков к файлу становится возмож­ным (в каждый момент времени только один поток имеет доступ к файлу). Важно знать, что если поток не закрыт и не ассоциирован с запушенной программой, то высока ве­роятность его повреждения.

Даже если вы не закроете поток явно, использовав метод Close, система автомати­чески закроет файл при нормальном завершении программы. Если же программа закон­чит свою работу аварийно, рабочие файлы останутся открытыми. Поэтому следует зак­рывать поток сразу же после того, как потребность в нем отпадет.

Вот некоторые члены класса StreamWriter

Close закрывает выходной поток и освобождает ассоциированные с ним ресурсы.

Write выводит в поток один или несколько символов без символа новой строки.

WriteLine выводит один или несколько символов и добавляет символ новой строки.

Некоторые члены класса StreamReader

Close закрывает выходной поток и освобождает ассоциированные с ним ресурсы.

Read читает очередной символ (символы) из входного потока.

ReadLine читает очередную последовательность символов из входного потока и возвращает ее в форме строки. Возвращает null, если достигнут конец файла.

Метод WriteLine удобен для записи строки текста (в формате string) в поток StreamWriter. Метод WriteLine автоматически вставляет символ новой строки после каж­дого строкового аргумента, записываемого в файл. Например, если StreamWriter исполь­зуется для записи в файл myFile и метод WriteLine вызывается три раза, то myFile будет содержать три символа новой строки (NL), — по одному после каждой строки EOF.

Соответственно, метод ReadLine читает данные до следующего символа новой стро­ки в файле и возвращает символы из этого участка файла в форме строки string.

Метод Write класса StreamWriter является сильно перегруженным. Его можно исполь­зовать для записи в поток отдельного символа, строки, массива символов и других эле­ментов данных. Все семнадцать перегруженных методов Write описаны в документации библиотеки .NET.

Метод Write (в отличие от метода WriteLine) автоматически не добавляет в поток символ новой строки.

Элемент Read класса StreamReader соответствует двум методам. Первый имеет лишь один аргумент и считывает текущий символ из потока. Вторая его версия позволяет указать, сколько символов требуется прочесть из потока.

Следующая программа демонстрирует применение классов StreamWriter и StreamReader. Каждая строка через выходной поток StreamWriter записывается в файл C:\MyTestFiles\MyFile.txt, который затем закрывается. После этого программа открывает файл C:\MyTestFiles\MyFile.txt и через входной поток StreamReader, читает содержимое файла и выводит его на консоль.

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

class TextReaderWriter

{

public static void WriteTextToFile()

{

string textLine;

StreamWriter outstream = null;

try

{

FileInfo textFile = new FileInfo (@"C:\MyTestFile\MyFile.txt");

outstream = textFile.CreateText();

Console.WriteLine("Заполните файл тремя строками");

for (int i = 0; i < 3; i++)

{

textLine = Console.ReadLine();

outstream.WriteLine(textLine);

}

}

catch (IOException exObj)

{

Console.WriteLine(exObj);

}

finally

{

outstream.Close();

}

}

public static void ReadTextFromFile()

{

string textLine;

StreamReader inStream = null;

try

{

FileInfo textFile = new FileInfo(@"C:\MyTestFile\MyFile.txt");

inStream = textFile.OpenText();

Console.WriteLine("Чтение из файла");

textLine = inStream.ReadLine();

while (textLine != null)

{

Console.WriteLine(textLine);

textLine = inStream.ReadLine();

}

}

catch (IOException exObj)

{

Console.WriteLine(exObj);

}

finally

{

inStream.Close();

}

}

}

class Tester

{

public static void Main()

{

TextReaderWriter.WriteTextToFile();

TextReaderWriter.ReadTextFromFile();

Console.ReadLine();

}

}

Сначала создается новый экземпляр FileInfo по имени textFile. Программа передает конструктору имя файла, который нужно создать (C:\MyTestFiles\MyFile.txt). Далее вызывается метод CreateText, который возвращает экземпляр на StreamWriter для записи в новый файл C:\MyTestFiles\MyFile.txt. Этот экземпляр StreamWriter при­сваивается выходному потоку outStream. Когда файл подключается к потоку, как, на­пример, в строке:

outstream = textFile.CreateText();

принято говорить, что файл открывается. Если файл до этого не существовал (как в случае с MyFile.txt) — создается новый. Если к этому моменту существует старый файл с таким же именем, его содержимое стирается и заменяется новым. В любом случае, программа начинает работать с чистым файлом.

Цикл for исполняется трижды. Во время каждой итерации, строке, введенной пользователем, присваивается textLine. В следующей строке textLine передается выходному потоку outStream как аргумент выходному потоку outStream. В конце этих трех итераций, MyStory.txt содержит символы всех трех строк, введенных пользователем.

Важно закрыть outStream, поэтому метод Close и вызывается в блоке finally, связанном с операторами catch-try. Это гарантирует, что outStream будет зак­рыт, даже если произойдет исключение.

Блок finally случайно может быть запушен для аварийно завершения во время исполнения связанного с ним блока try. Поэтому компилятор требует, чтобы все переменные из блока finally, объявленные вне блока try (outStream и inStream), инициализировались перед входом в блок try. Чтобы. избежать ошибок при компиляции, программа инициализирует outStream и inStream значением null.

Метод WriteTextToFile вызывается из метода Main. К мо­менту вызова метода ReadTextFromFile, файл MyStory.txt уже создан, и его можно использовать для демонстрации класса StreamReader. Рассмотрим ReadTextFromFile подробнее.

В программе создается экземпляр FileInfo по имени textFile. Имя файла снова переда­ется как аргумент конструктору(данный файл уже существует).

Далее метод OpenText возвращает ссылку на экземпляр StreamReader для по­лучения доступа к связанному с ним файлу MyStory.txt. Эта ссылка присваивается эк­земпляру inStream, который теперь можно использовать для чтения из MyStory.txt.

Как было сказано ранее, метод ReadLine читает текущую строку и возвращает ре­зультат в формате string. По достижении конца файла он возвращает null. Переменной textLine присваивается значение, воз­вращаемое. ReadLine. Результат проверяется в операторе цикла while, который повторяется, если textLine не равно null. Это условие нарушится, когда будет достигнут конец файла. Таким образом, если textLine не равно null, его содержимое пересылается на консоль. ReadLine повторно вызывается до тех пор, пока не будет дос­тигнут конец файла. Эта конструкция гарантирует, что каждая строка MyStory.txt, за­канчивающаяся символом новой строки, отправляется на консоль.