Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа9_C#.doc
Скачиваний:
118
Добавлен:
23.03.2015
Размер:
143.87 Кб
Скачать

2.3 Работа с потоками. Выходной поток

Создайте новый консольный проект C#, назовите егоStreamWrite. Добавьте в него пространство именSystem.IO, после чего добавьте следующий код:

static void Main(string[] args)

{

try

{

// Создание объекта, привязаного к файлу

FileStream aFile = new FileStream("Log.txt", FileMode.OpenOrCreate);

// Создание потока вывода через файл

StreamWriter sw = new StreamWriter(aFile);

// Запись данных з файл //

// Запись строки

sw.WriteLine("Hello World");

// Просто запись передаваемых символов

sw.Write("This is a ");

sw.Write("string of characters.");

sw.Close();

}

catch(IOException e)

{

Console.WriteLine("An 10 exception has been thrown!");

Console.WriteLine(e.ToString());

Console.ReadLine();

return;

}

}

Откомпилируйте и запустите приложение. В папке Debug проекта появится файл Log.txt, в котором будет содержаться текст, показаный на рис. 9. 2.

Рис. 9.2. Содержимое файла Log.txt

2.4 Работа с потоками. Входной поток

Создайте новый консольный проект C#, назовите егоStreamRead. Добавьте в него пространство именSystem.IO, после чего добавьте следующий код:

static void Main(string[] args)

{

string strLine;

try

{

FileStream aFile = new FileStream("Log.txt", FileMode.Open);

StreamReader sr = new StreamReader(aFile);

strLine = sr.ReadLine();

//Построчное считывание данных

while (strLine != null)

{

Console.WriteLine(strLine);

strLine = sr.ReadLine();

}

sr.Close();

Console.ReadLine();

}

catch (IOException e)

{

Console.WriteLine("An I0 exception has been thrown!");

Console.WriteLine(e.ToString());

Console.ReadLine();

return;

}

return;

}

Откомпилируйте проект, и перед тем, как запускать его, скопируйте в папку Debug файл Log.txt из предыдущего примера. Иначе, конструктор объекта FileStream сгенерирует исключительную ситуацию, так как ему не удастся найти файл.

После этого запустите приложение. На консоль будет выведен текст, аналогичный тому, что на рис. 9.2.

2.5 Асинхронное считывание файлов с использованием событий

Создайте новый консольный проект C#, назовите егоAsyncReadEvents. Добавьте в него пространство именSystem.IO, измените имя классаProgram.csнаAsyncRead.csпосле чего добавьте в этот класс следующие переменные:

class AsyncRead

{

byte[] byData;

char[] charData;

Далее, непосредственно за определение этих переменных добавьте конструктор класса:

public AsyncRead()

{

byData = new byte[100];

charData = new Char[100];

try

{

FileStream aFile = new FileStream ("../.. /AsyncRead.cs", FileMode.Open);

System.AsyncCallback cb = new AsyncCallback(this.HandleRead);

System.IAsyncResult aResult=aFile.BeginRead(byData,0,100,cb,"Read AsyncRead.cs");

}

catch(IOException e)

{

Console.WriteLine("An I0 excepti-on has been thrown!");

Console.WriteLine(e.ToString());

Console.ReadLine();

return;

}

}

Теперь добавьте метод, возвращающий сообщение— HandleRead(),сразу после конструктора.

private void HandleRead(IAsyncResult ar)

{

Decoder d = Encoding.UTF8.GetDecoder();

d.GetChars(byData, 0, byData.Length, charData, 0);

Console.WriteLine("Value of state object for this operation: {0}", ar.AsyncState);

Console.WriteLine(charData);

}

И последнее, напишите код функции Main():

static void Main(string[] args)

{

AsyncRead aClass = new AsyncRead();

for(int x=0;x<200;x++)

{

Console.WriteLine(x);

}

Console.ReadLine();

return;

}

Запустите приложение, вы должны увидеть вывод, представленый на рисунке 9.3.

Рис. 9.3.Вывод приложения

В этом примере создается объект класса AsyncRead, после чего приложение занимается своей работой – выводит числа от 0 до 199. Оно никак не отслеживает процесс считывания файла.

Считывание файла в асинхронном режиме запускается в конструкторе класса AsyncRead, при этом в системе регистрируется метод, возвращающий сообщение.

Следующие после открытия объекта FileStreamдве строки кода выполняют все для этого необходимое:

System.AsyncCallback cb = new AsyncCallback(this.HandleRead);

System.IAsyncResult aResult = aFile.BeginRead(byData,0,100, cb,"Read AsyncRead.cs");

В первой строке происходит создание объекта AsyncCallback, который передается в качестве четвертого параметра методуBeginRead ().Для этого создается совершенно новый объектAsyncCallback, передавая адрес метода, который будет принимать объектIAsyncResultв качестве своего единственного параметра. В следующей строке осуществляется вызов методаBeginRead(), которому передаются стандартные данные, и, кроме того, объектAsyncCallbackи строка "ReadAsyncRead.cs". Это — задаваемый пользователем объект состояния, который будет использоваться нами позднее — в методе, возвращающем сообщение. Это не имеет никакого смысла для данного сценария, поскольку мы осуществляем только один запрос на асинхронное считывание, но если бы таких запросов было несколько, то нам потребовался бы способ отличать один от другого.

В методе HandleRead()не происходит ничего такого, чего бы нам не встречалось ранее. Он просто перекодирует данные и выводит символьный массив на консоль. В нем также выводится значение свойстваAsyncStateобъектаIAsyncResult.

private void HandleRead(IAsyncResult ar)

{

Decoder d = Encoding.UTF8.GetDecoder();

d.GetChars(byData, 0, byData.Length, charData, 0);

Console.WriteLine("Value of state object for this operation: {0}", ar.AsyncState);

Console.WriteLine(charData);

}

Наиболее интересен тот факт, что данный метод не вызывается приложением. Он вызывается системой .NET Framework в тот момент, когда завершается процедура считывания файла. Это позволяет приложению продолжать обработку какой-либо иной информации, пока выполняется относительно медленная процедура считывания файла.