Нажата клавиша
• Вы нажали клавишу: •
Нажата клавиша
Q Вы нажали клавишу: Q
Нажата клавиша
Как следует из приведенного выше результата, всякий раз, когда нажимается клавиша, метод ReadKey()
немедленно возвращает введенный с клавиатуры символ. Этим он отличается от упоминавшегося ранее метода Read()
, в котором ввод выполняется с построчной буферизацией. Поэтому если требуется добиться в программе реакции на ввод с клавиатуры, то рекомендуется выбрать метод ReadKey()
.
Потоки Console.Out
и Console.Error
являются объектами типа TextWriter
. Вывод на консоль проще всего осуществить с помощью методов Write()
и WriteLine()
, с которыми вы уже знакомы. Существуют варианты этих методов для вывода данных каждого из встроенных типов. В классе Console определяются его собственные варианты метода Write()
и WriteLine()
, и поэтому они могут вызываться непосредственно для класса Console, как это было уже не раз показано на страницах данной книги. Но при желании эти и другие методы могут быть вызваны и для класса TextWriter, который является базовым для потоков Console.Out
и Console.Err
or.
Ниже приведен пример программы, в котором демонстрируется вывод в потоки Console.Out
и Console.Error
. По умолчанию данные в обоих случаях выводятся на консоль.
// Организовать вывод в потоки Console.Out и Console.Error.
using System;
class ErrOut {
static void Main() {
int a=10, b=0;
int result;
Console.Out.WriteLine("Деление на нуль приведет " +
"к исключительной ситуации.");
try {
result = a / b; // сгенерировать исключение при попытке деления на нуль
} catch(DivideByZeroException exc) {
Console.Error.WriteLine(exc.Message);
}
}
}
При выполнении этой программы получается следующий результат.
Деление на нуль приведет к исключительной ситуации.
Попытка деления на нуль.
Начинающие программисты порой испытывают затруднения при использовании потока Console.Error
. Перед ними невольно встает вопрос: если оба потока, Console.Out
и Console.Error
, по умолчанию выводят результат на консоль, то зачем нужны два разных потока вывода? Ответ на этот вопрос заключается в том, что стандартные потоки могут быть переадресованы на другие устройства. Так, поток Console.Error
можно переадресовать в выходной файл на диске, а не на экран. Это, например, означает, что сорбщения об ошибках могут быть направлены в файл журнала регистрации, не мешая выводу на консоль. И наоборот, если вывод на консоль переадресуется, а вывод сообщений об ошибках остается прежним, то на консоли появятся сообщения об ошибках, а не выводимые на нее данные. Мы еще вернемся к вопросу переадресации после рассмотрения файлового ввода-вывода.
Класс FileStream и байтовый ввод-вывод в файл
В среде .NET Framework предусмотрены классы для организации ввода-вывода в файлы. Безусловно, это в основном файлы дискового типа. На уровне операционной системы файлы имеют байтовую организацию. И, как следовало ожидать, для ввода и вывода байтов в файлы имеются соответствующие методы. Поэтому ввод и вывод в файлы байтовыми потоками весьма распространен. Кроме того, байтовый поток ввода или вывода в файл может быть заключен в соответствующий объект символьного потока. Операции символьного ввода-вывода в файл находят применение при обработке текста. О символьных потоках речь пойдет далее в этой главе, а здесь рассматривается байтовый ввод-вывод.
Для создания байтового потока, привязанного к файлу, служит класс FileStream
. Этот класс является производным от класса Stream
и наследует всего его функции.
Напомним, что классы потоков, в том числе и FileStream
, определены в пространстве имен System.IO
. Поэтому в самом начале любой использующей их программы обычно вводится следующая строка кода.
using System.IO;
Для формирования байтового потока, привязанного к файлу, создается объект класса FileStream
. В этом классе определено несколько конструкторов. Ниже приведен едва ли не самый распространенный среди них:
FileStream(string путь, FileMode режим)