Г. Шилдт - Полный справочник по C# (1160789), страница 73
Текст из файла (страница 73)
In, можно перенаправлять. Безусловно, чаще всего они перенаправляются в какой-нибудь файл. Приперенаправлении стандартного потока входные и/или выходные данные автоматически направляются в новый поток. При этом устройства, действующие по умолчанию,игнорируются. Благодаря перенаправлению стандартных потоков программа можетсчитывать команды из дискового файла, создавать системные журналы или даже считывать входные данные с сетевых устройств.Перенаправить стандартный поток можно двумя способами.
Во-первых, при выполнении программы из командной строки можно использовать операторы " < " и " > " ,чтобы перенаправить потоки Console. In и/или Console.Out, соответственно. Рассмотрим, например, следующую программу:u s i n g System;class Test {public static void Main() {Console.WriteLine("Это тест.");392Часть I. Язык С#При выполнении ее с помощью командной строкиTest > logтекстовая строка "Это тест." будет записана в файл log.
Входной поток можно перенаправить аналогичным способом. При перенаправлении входного потока важно позаботиться о том, чтобы задаваемый источник входных данных содержал информацию, удовлетворяющую требованиям программы. В противном случае программа зависнет.Операторы перенаправления " < " и " > " являются частью не языка С#, а операционной системы. Таким образом, если среда поддерживает функцию перенаправленияпотоков ввода-вывода (как это реализовано в Windows), вы сможете перенаправитьстандартные входные и выходные потоки, не внося изменений в программы. Однакосуществует и второй способ, который позволяет перенаправлять стандартные потокиименно программно.
Для этого понадобятся следующие методы S e t l n ( ) , SetOut () иS e t E r r o r (), которые являются членами класса Console:static void Setln(TextReader input)static void SetOut(TextWriter output)static void SetError(TextWriter output)Таким образом, чтобы перенаправить входной поток, вызовите метод S e t i n O ,указав в качестве параметра желаемый поток. Вы можете использовать любой входнойпоток, если он является производным от класса TextReader. Чтобы перенаправитьвыходной поток в файл, задайте Filestream-объект, помещенный в оболочкуStreamWriter-объекта. Пример перенаправления потоков проиллюстрирован следующей программой:// Перенаправление потока Console.Out.using System;using System.10;class Redirect {public s t a t i c void Main() {StreamWriter log_out;Jtry {log_out = new StreamWriter("logfile.txt");}catch(IOException exc) {Console.WriteLine(exc.Message +"He удается открыть файл.");return ;// Направляем стандартный выходной поток в// системный журнал.Console.SetOut(log_out);Console.WriteLine("Это начало системного журнала.");for(int i=0; i<10; i++) Console.WriteLine(i);Console.WriteLine("Это конец системного журнала.");log_out.Close() ;Глава 14.
Использование средств ввода-вывода393При выполнении этой программы на экране не появится ни одного символа, нофайл logf i l e . t x t будет иметь такое содержимое:Это начало системного журнала.О12345б789Это конец системного журнала.При желании вы можете поэкспериментировать, перенаправляя другие встроенныепотоки ввода-вывода.Считывание и запись двоичных данныхДо сих пор мы считывали и записывали байты или символы, но эти операции ввода-вывода можно выполнять и с другими типами данных. Например, вы могли бысоздать файл, содержащий i n t - , double- или short-значения. Для считывания и записи двоичных значений встроенных С#-типов используйте классы BinaryReader иBinaryWriter.
Важно понимать, что эти данные считываются и записываются с использованием внутреннего двоичного формата, а не в текстовой форме, понятной человеку.Класс BinaryWriterКласс BinaryWriter представляет собой оболочку для байтового потока, котораяуправляет записью двоичных данных.
Его наиболее употребительный конструкторимеет следующий вид:BinaryWriter(Stream outputStream)Здесь элемент outputStreamозначает поток, в который будут записываться данные. Чтобы записать выходные данные в файл, можно использовать для этого параметра объект, созданный классом FileStream. Если поток outputStreamимеетnull-значение, генерируется исключение типа ArgumentNullException, а если поток outputStream не открыт для записи, — исключение типа ArgumentException.В классе BinaryWriter определены методы, способные записывать значения всехвстроенных С#-типов (некоторые из них перечислены в табл. 14.5).
Обратите внимание: значение типа s t r i n g записывается с использованием внутреннего формата, который включает спецификатор длины. В классе BinaryWriter также определеныстандартные методы p l o s e () и Flush (), работа которых описана выше.Таблица 14.5. Методы вывода информации, определенные в классе BinaryWriterМетодvoid w r i t e (sbyte val)void w r i t e (byte val)394ОписаниеЗаписывает byte-значение (со знаком)Записывает byte-значение (без знака)Часть I. Язык С#Окончание табл. 14.5МетодОписаниеv o i d w r i t e ( b y t e [ ] buf)Записывает массив byte-значенийv o i d w r i t e ( s h o r t vai)Записывает целочисленное значение типа s h o r t (короткое целое)v o i d w r i t e ( u s h o r t vai)Записывает целочисленное u s h o r t -значение (короткое целое без знака)v o i d w r i t e ( i n t vai)Записывает целочисленное значение типа i n tv o i d w r i t e ( u i n t vai)Записывает целочисленное uint-значение (целое без знака)void w r i t e (long vai)Записывает целочисленное значение типа l o n g (длинное целое)v o i d w r i t e ( u i o n g vai)Записывает целочисленное uiong-значение (длинное целое без знака)v o i d w r i t e ( f l o a t vai)Записывает float-значениеv o i d w r i t e (double v a i )Записывает double-значениеv o i d w r i t e ( c h a r vai)Записывает символvoid w r i t e (char[] buf)Записывает массив символовv o i d w r i t e ( s t r i n g vai)Записывает string-значение с использованием его внутреннего представления, которое включает спецификатор длиныКласс BinaryReaderКласс BinaryReader представляет собой оболочку для байтового потока, котораяуправляет чтением двоичных данных.
Его наиболее употребительный конструкторимеет такой вид:BinaryReader(Stream.inputStream)Здесь элемент inputStreamозначает поток, из которого считываются данные.Чтобы выполнить чтение из файла, можно использовать для этого параметра объект,созданный классом FileStream. Если поток inputStream имеет null-значение, генерируется исключение типа ArgumentNullException, а если поток inputStream неоткрыт для чтения,— исключение типа ArgumentException.В классе BinaryReader предусмотрены методы для считывания всех простых С#типов.
Наиболее употребимые из них показаны в табл. 14.6. Обратите внимание на то,что метод ReadStringO считывает строку, которая хранится с использованием внутреннего формата, включающего спецификатор длины. При обнаружении конца потока все эти методы генерируют исключение типа EndOfStreamException, а при возникновении ошибки — исключение типа IOException.
В классе BinaryReader также определены следующие версии метода Read ():МетодОписаниеi n t Re a d ()Возвращает целочисленное представление следующего доступного символа из вызывающего входного потока. При обнаружении конца файла возвращает значение -1i n t Read ( b y t e [ ] buf,i n t offset,i n t num)Делает попытку прочитать num байтов в массив buf, начиная с элементаbuf[offset],и возвращает количество успешно считанных байтовi n t Read (char [ ] buf,i n t offset,i n t лшп)Делает попытку прочитать лил символов в массив buf, начиная с элементаbuf[offset],и возвращает количество успешно считанных символовВ случае неудачного исхода операции чтения эти методы генерируют исключениетипа IOException.Глава 14.
Использование средств ввода-вывода395В классе BinaryReader также определен стандартный метод Close ( ) .Таблица 14.6. Методы ввода данных, определенные в классе BinaryReadezМетодОписаниеbool ReadBoolean()Считывает booi-значениеbyte ReadByte()Считывает byte-значениеsbyte ReadSByteOСчитывает sbyte-значениеbyte[] ReadBytes(int num)Считывает лит байтов и возвращает их в виде массиваchar ReadChar()Считывает char-значениеchar[] ReadChars(int num)Считывает л и т символов и возвращает их в виде массиваdouble ReadDouble()Считывает double-значениеfloat ReadSmgle ()Считывает float-значениеshort Readlntl6()Считывает short-значениеi n t Readlnt32()Считывает int-значениеlong Readlnt64()Считывает long-значениеushort ReadUIntl6()Считывает ushort-значениеuint ReadUInt32()Считывает uint-значениеulong ReadUInt64()Считывает uiong-значениеs t r i n g ReadStringOСчитывает string-значение, представленное во внутреннем двоичномформате, который включает спецификатор длины.
Этот метод следует использовать для считывания строки, которая была записана с помощьюобъекта класса B i n a r y W r i t e rДемонстрация использования двоичного ввода-выводаРассмотрим программу, которая иллюстрирует использование классов BinaryReaderи BinaryWriter.