ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Шрифт:
Выполнив эту программу, вы можете проверить содержимое нового файла (рис. 16.8).
Рис. 16.8. Содержимое вашего файла * .txt
Чтение из текстового файла
Теперь выясним, как программными средствами читать данные из файла, используя соответствующий тип StreamReader. Вы должны
Таблица 16.8. Основные члены TextReader
Член | Описание |
---|---|
Peek | Возвращает следующий доступный символ без фактического изменения позиции указателя считывающего объекта. Значение -1 указывает позицию, соответствующую концу потока |
Read | Читает данные входного потока |
ReadBlock | Читает максимальное заданное число символов текущего потока и записывает данные в буфер, начиная с указанного индекса |
ReadLine | Читает строку символов из текущего потока и возвращает данные в виде строки (пустая строка указывает EOF – конец файла) |
ReadToEnd | Читает все символы, начиная с текущей позиции и до конца потока, и возвращает их в виде одной строки |
Если теперь расширить имеющийся класс MyStreamWriter.Reader, чтобы использовать в нем StreamReader, вы сможете прочитать текстовые данные из файла reminders.txt, как показано ниже.
Выполнив программу, вы увидите символьные данные из reminders.txt, выведенные на консоль.
Непосредственное создание типов StreamWriter/StreamReader
Одной из смущающих особенностей работы с типами из System.IO является то, что часто одних и тех же результатов можно достичь в рамках множества подходов. Например, вы видели, что можно получить StreamWriter из File или из FileInfo, используя метод CreateText. На самом деле есть еще одна возможность получения StreamWriters и StreamReaders – это непосредственное их создание. Например, наше приложение можно было бы переписать в следующем виде.
Видеть
так много идентичных, на первый взгляд, подходов к реализации ввода-вывода, может быть, немного странно, но имейте в виду, что конечным результатом здесь оказывается гибкость. Так или иначе, вы смогли увидеть, как можно извлекать символьные данные из файлов и помещать их в файлы, используя типы StreamWriter и StreamReader, и теперь мы с вами можем рассмотреть роль классов StringWriter и StringReader.Исходный код. Проект StreamWriterReaderApp размещен в подкаталоге, соответствующем главе 16.
Работа с типами StringWriter и StringReader
Используя типы StringWriter и StringReader, вы можете обращаться с текстовой информацией, как с потоком символов в памяти. Это может оказаться полезным тогда, когда необходимо добавить символьную информацию в соответствующий буфер. В следующем примере блок строковых данных записывается в объект StringWriter, а не в файл на локальном жестком диске.
Ввиду того, что и StringWriter, и StreamWriter получаются из одного и того же базового класса (TextWriter), для них используется приблизительно одинаковая программная логика записи. Однако ввиду самой своей природы, класс StringWriter позволяет извлечь объект System.Text.StringBuilder с помощью метода GetStringBuilder.
Чтобы прочитать данные из символьного потока, используйте соответствующий тип StringReader, который (в соответствии с ожиданиями) функционирует так же, как и родственный ему класс StreamReader. Фактически класс StringReader просто переопределяет наследуемые члены, чтобы обеспечить чтение из блока символьных данных, а не из файла.