Ещё одна категория потоков. Предопределённые потоки ввода-вывода используются для реализации ввода-вывода в рамках консольных приложений.
В классах предопределённых потоков в отличие от ранее рассмотренных потоков явным образом задаются источник (откуда) и место размещения (куда) информации.
Основные свойства и методы этих потоков определены в классе System.Console. Класс Console является достаточно сложной конструкцией.
В рамках этого класса определены данные-члены, обеспечивающие реализацию предопределённых потоков. В классе System.Console таких потоков три (In, Out, Error).
Ниже описываются свойства этих потоков:
§ Standard input stream - член класса Console In (в общепринятой нотации Console.In). Является объектом-представителем класса TextReader. По умолчанию поток In ориентирован на получение информации с клавиатуры,
§ Standard output stream - поток вывода Console.Out. Является объектом-представителем класса TextWriter. По умолчанию обеспечивает вывод информации на дисплей.
§ Standard error stream – поток вывода сообщений об ошибках Console.Error. Также является объектом-представителем класса TextWriter. И также по умолчанию выводит информацию на дисплей.
В классе System.Console также определены следующие функции-члены (вернее, множества ПЕРЕГРУЖЕННЫХ функций), обеспечивающих процедуры ввода-вывода:
§ Write и WriteLine,
§ Read и ReadLine.
При этом функции-члены класса Console ПО УМОЛЧАНИЮ обеспечивают связь с конкретным потоком. Например, при вызове метода
Console.WriteLine(…); // Список параметров опущен
информация направляется в поток Console.Out. Класс Console также обеспечивает вызов соответствующей функции-члена от имени объекта-представителя класса TextWriter. Непосредственное обращение к члену класса Console (то есть, к потоку), отвечающего за текстовый вывод, имеет следующую форму вызова:
Console.Out.WriteLine(…);
Вызов определённого в классе Console метода ReadLine
Console.ReadLine(…);
обеспечивает получение информации через поток Console.In. Непосредственный вызов аналогичной функции от имени члена класса Console, представляющего класс TextReader, выглядит следующим образом:
Console.In.ReadLine(…);
Функции-представителя класса Console, отвечающей за непосредственное направление информации в поток вывода сообщений об ошибках, не предусмотрено.
Вывод информации об ошибках может быть реализован путём непосредственного обращения к потоку:
Console.Error.WriteLine(…);
Если вспомнить, что объект Error является представителем того же самого класса TextWriter и, так же как и объект Out связан с окном консольного приложения, разделение сообщений, связанных с нормальным ходом выполнения приложения и сообщений об ошибках становится более чем странным.
Информация, выводимая приложением в “штатном” режиме и сообщения об ошибках одинаково направляются в окно приложения на экран консоли. Однако в классе Console реализована возможность перенаправления соответствующих потоков. Например, стандартный поток вывода можно перенаправить в файл, а поток сообщений об ошибках оставить без изменений направленным в окно приложения. Результат очевиден.
Процедуры перенаправления потоков осуществляются с помощью методов void SetIn(TextReader in), void SetOut(TextWriter out), void SetErr(TextWriter err) и будут рассмотрены ниже.