Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен

Читать онлайн ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 141 142 143 144 145 146 147 148 149 ... 259
Перейти на страницу:

Работа с StreamWriter и StreamReader

Классы StreamWriter и StreamReader оказываются полезны тогда, когда приходится читать или записывать символьные данные (например, строки). Оба эти типа по умолчанию работают с символами Unicode, однако вы можете изменить эти установки, предоставив ссылку на правильно сконфигурированный объект System.Text.Encoding. Чтобы упростить рассмотрение, предположим, что предлагаемое по умолчавию кодирование в символы Unicode как раз и является подходящим.

Тип StreamReader получается из абстрактного типа TextReader. To же можно сказать и о родственном типе StringReader (он будет обсуждаться в этой главе позже). Базовый класс TextReader обеспечивает каждому из этих "последователей" очень небольшой набор функциональных возможностей, среди которых, в частности, возможность чтения символов из потока и их добавление в поток.

Тип StreamWriter (как и StringWriter, который также будет рассматриваться позже) получается из абстрактного базового класса TextWriter. Этот класс определяет члены, позволяющие производным типам записывать текстовые данные в имеющийся символьный поток. Взаимосвязь между этими новыми типами ввода-вывода показана на рис. 16.7.

Чтобы помочь вам понять возможности записи классов StreamWriter и StringWriter, в табл. 16.7 предлагаются описания основных членов абстрактного базового класса TextWriter.

Рис. 16.7. Читатели и писатели

Таблица 16.7. Основные члены TextWriter 

Член Описание Close() Закрывает записывающий объект и освобождает связанные с ним ресурсы. При этом автоматически очищается буфер Flush() Очищает все буферы текущего записывающего объекта с тем, чтобы все данные буфера были записаны на соответствующее устройство, но не закрывает сам записывающий объект NewLine Указывает константу обрыва строки для производного класса записывающего объекта. По умолчанию признаком обрыва строки является возврат каретки с переходом на новую строку (rn) Write() Записывает строку в текстовый поток без добавления константы обрыва строки WriteLine() Записывает строку в текстовый поток с добавлением константы обрыва строки 

Замечание. Последние два из указанных в таблице членов класса TextWriter, вероятно, покажутся вам знакомыми. Если вы помните, у типа System.Console есть члены Write() и WriteLine(), записывающие текстовые данные в устройство стандартного вывода. На самом деле свойство Console.In является упаковкой для TextWriter, а свойство Console.Out – для TextReader.

Производный класс StreamWriter обеспечивает подходящую реализацию методов Write(), Close() и Flush() и определяет дополнительное свойство AutoFlush. Это свойство, когда его значение равно true (истина), заставляет StreamWriter при выполнении операции записи записывать все данные. Можно добиться лучшей производительности, если установить для AutoFlush значение false (ложь), поскольку иначе при каждой записи StreamWriter будет вызываться Close().

Запись в текстовый файл

Рассмотрим пример работал с типом StreamWriter. Следующий класс создает новый файл reminders.txt с помощью метода File.CreateText(). С помощью полученного объекта StreamWriter в новый файл добавляются определенные текстовые данные, как показано ниже.

static void Main(string[] args) {

 Console.WriteLine("*** Забавы с StreamWriter/StreamReader ***n");

 // Получение StreamWriter и запись строковых данных.

 StreamWriter writer = File.CreateText("reminders.txt");

 writer.WriteLine("Нe забыть о дне рождения мамы…");

 writer.WriteLine("Не забыть о дне рождения папы…");

 writer.WriteLine("Не забыть о следующих числах:");

 for(int i = 0; i ‹ 10; i++) writer.Write(i + " ");

 // вставка новой строки.

 writer.Write(writer.NewLine);

 // Закрытие автоматически влечет запись всех оставшихся данных!

 writer.Close();

 Console.WriteLine("Создан файл и записаны некоторые идеи…");

}

Выполнив эту программу, вы можете проверить содержимое нового файла (рис. 16.8).

Рис. 16.8. Содержимое вашего файла * .txt

Чтение из текстового файла

Теперь выясним, как программными средствами читать данные из файла, используя соответствующий тип StreamReader. Вы должны помнить, что этот класс получается из TextReader, функциональные возможности которого описаны в табл. 16.8.

Таблица 16.8. Основные члены TextReader

Член Описание Peek() Возвращает следующий доступный символ без фактического изменения позиции указателя считывающего объекта. Значение -1 указывает позицию, соответствующую концу потока Read() Читает данные входного потока ReadBlock() Читает максимальное заданное число символов текущего потока и записывает данные в буфер, начиная с указанного индекса ReadLine() Читает строку символов из текущего потока и возвращает данные в виде строки (пустая строка указывает EOF – конец файла) ReadToEnd() Читает все символы, начиная с текущей позиции и до конца потока, и возвращает их в виде одной строки

Если теперь расширить имеющийся класс MyStreamWriter.Reader, чтобы использовать в нем StreamReader, вы сможете прочитать текстовые данные из файла reminders.txt, как показано ниже.

static void Main(string[] args) {

 Console.WriteLine("*** Забавы с StreamWriter/StreamReader ***n");

 …

 // Теперь чтение данных из файла.

 Console.WriteLine("Вот ваши идеи:n");

 StreamReader sr = File.OpenText("reminders.txt");

 string input = null;

 while ((input = sr.ReadLine()) != null) {

  Console.WriteLine(input);

 }

}

Выполнив программу, вы увидите символьные данные из reminders.txt, выведенные на консоль.

Непосредственное создание типов StreamWriter/StreamReader

Одной из смущающих особенностей работы с типами из System.IO является то, что часто одних и тех же результатов можно достичь в рамках множества подходов. Например, вы видели, что можно получить StreamWriter из File или из FileInfo, используя метод CreateText(). На самом деле есть еще одна возможность получения StreamWriters и StreamReaders – это непосредственное их создание. Например, наше приложение можно было бы переписать в следующем виде.

static void Main(string[] args) {

 Console.WriteLine("*** Забавы с StreamWriter/StreamReader ***n");

 // Get a StreamWriter and write string data.

 StreamWriter writer = new StreamWriter("reminders.txt");

 …

 // Now read data from file.

 StreamReader sr = new StreamReader("reminders.txt");

 …

}

Видеть так много идентичных, на первый взгляд, подходов к реализации ввода-вывода, может быть, немного странно, но имейте в виду, что конечным результатом здесь оказывается гибкость. Так или иначе, вы смогли увидеть, как можно извлекать символьные данные из файлов и помещать их в файлы, используя типы StreamWriter и StreamReader, и теперь мы с вами можем рассмотреть роль классов StringWriter и StringReader.

Исходный код. Проект StreamWriterReaderApp размещен в подкаталоге, соответствующем главе 16.

Работа с типами StringWriter и StringReader

Используя типы StringWriter и StringReader, вы можете обращаться с текстовой информацией, как с потоком символов в памяти. Это может оказаться полезным тогда, когда необходимо добавить символьную информацию в соответствующий буфер. В следующем примере блок строковых данных записывается в объект StringWriter, а не в файл на локальном жестком диске.

static void Main(string[] args) {

 Console.WriteLine("*** Забавы с StringWriter/StringReader ***n");

 // Создание StringWriter и вывод символьных данных в память.

 StringWriter strWriter = new StringWriter();

 strWriter.WriteLine("He забыть о дне рождения мамы…");

 strWriter.Close();

 // Получение копии содержимого (сохраненного в строке) и

 // вывод на консоль.

 Console.WriteLine("Содержимое StringWriter:n{0}", strWriter);

}

Ввиду того, что и StringWriter, и StreamWriter получаются из одного и того же базового класса (TextWriter), для них используется приблизительно одинаковая программная логика записи. Однако ввиду самой своей природы, класс StringWriter позволяет извлечь объект System.Text.StringBuilder с помощью метода GetStringBuilder().

1 ... 141 142 143 144 145 146 147 148 149 ... 259
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен.
Комментарии