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