Шрифт:
Выполнив эту программу, вы можете проверить содержимое нового файла (рис. 16.8).
Рис. 16.8. Содержимое вашего файла * .txt
Чтение из текстового файла
Теперь выясним, как программными средствами читать данные из файла, используя соответствующий тип StreamReader. Вы должны помнить, что этот класс получается из TextReader, функциональные возможности которого описаны в табл. 16.8.
Таблица 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, а не в файл на локальном жестком диске.