Книга: C# для профессионалов. Том II
Класс StreamReader
Класс StreamReader
Класс StreamReader
используется для чтения текстовых файлов. Создать StreamReader
проще, чем экземпляр FileStream
, так как некоторые из параметров FileStream
не требуются. В частности, режим и тип доступа несущественны, поскольку с помощью StreamReader
можно только читать. Также не существует непосредственного параметра для определения полномочий общего доступа. Но с другой стороны, существуют и новые параметры:
? Необходимо определить, что делать с различными методами кодирования. Можно дать инструкцию StreamReader
проверять маркеры кода байтов в файле, чтобы выяснить метод кодирования, или можно просто приказать StreamReader
предполагать, что файл использует определенный метод кодирования.
? Вместо предоставления имени файла для чтения, можно предоставить ссылку на другой поток.
Эта последняя возможность заслуживает дополнительного обсуждения, так как иллюстрирует еще одно преимущество обоснования модели чтения и записи данных вокруг концепции потоков. Поскольку StreamReader
работает на относительно высоком уровне, может оказаться полезным в ситуации, когда имеется другой поток, который читает данные из некоторого другого источника, использовать средства, предоставляемые StreamReader
для обработки этого потока, как если бы он содержал текст. Это можно сделать, передавая вывод из этого потока в StreamReader
. Таким образом, StreamReader
может использоваться для чтения и обработки данных из любого источника данных, а не только файлов. Это по сути ситуация, которая рассматривалась ранее в отношении класса BinaryReader
. Однако в этой книге мы будем использовать StreamReader
только для прямого соединения с файлами.
В силу указанных возможностей StreamReader
имеет большое число конструкторов. Помимо этого существует пара методов FileInfo
, которые также возвращают ссылки на StreamReader
: OpenText()
и CreateText()
. Здесь мы проиллюстрируем некоторые из конструкторов.
Простейший конструктор получает только имя файла. Этот StreamReader
будет проверять маркеры кода байтов, чтобы определить кодирование:
StreamReader sr = new StreamReader(@"C:My DocumentsReadMe.txt");
И наоборот, если желательно определить, предполагается ли кодирование UTF8:
StreamReader sr = new StreamReader(@"C:My DocumentsReadMe.txt", Encoding.UTF8Encoding);
Мы определяем кодирование, используя одно из нескольких свойств класса, System.Text.Encoding
. Этот класс является абстрактным базовым классом, из которого определяется ряд классов, которые реализуют методы, реально выполняющие кодирование текста. Каждое свойство возвращает экземпляр соответствующего класса. Здесь можно использовать следующие свойства:
? ASCII
? Unicode
? UTF7
? UTF8
? BigEndianUnicode
Следующий пример показывает сцепление StreamReader
с FileStream
. Преимущество этого состоит в том, что можно явно определить, создавать ли файл и полномочия совместного доступа, что невозможно сделать, если напрямую соединять StreamReader с файлом:
FileStream fs =
new FileStream(@"C:My DocumentsReadMe.txt", FileMode.Open,
FileAccess.Read, FileShare.None);
StreamReader sr = new StreamReader(fs);
Для этого примера мы уточняем., что StreamReader
будет искать маркеры кода байтов, чтобы определись используемый метод кодирования, так он будет делать и в следующих примерах, где StreamReader
получают из экземпляра FileInfo
:
FileInfo MyFile = new FileInfo(@"C:My DocumentsReadMe.txt");
StreamReader sr = MyFile.OpenText();
Также как с FileStream
, необходимо всегда закрывать StreamReader
после использования. Невыполнение этого приведет к файлу, остающемуся заблокированным для других процессов (если только для создания StreamReader
не использовался FileStream
со спецификацией FileShare.ShareReadWrite
).
sr.Close();
Теперь мы перешли к проблеме создания экземпляра StreamReader
. Так же, как с классом FileStream
, мы просто указываем различные способы чтения данных и оставляем другие, менее часто используемые, методы StreamReader
для документации MSDN.
Возможно, простейшим в использовании является метод ReadLine()
, который продолжает чтение, пока не доходит до конца строки. Он не включает комбинацию возврат каретки-перевода строки, которая отмечает конец строки в возвращаемой строке:
string NextLine = sr.ReadLine();
Альтернатива — захватить весь остаток файла (или строго говоря, остаток потока) в одной строке:
string RestOfStream = sr.ReadToEnd();
Можно также прочитать один символ:
int NextChar = sr.Read();
Эта конструкция с Read()
преобразует возвращаемый символ в int
. Это делается так, потому что имеется возможность альтернативного возврата -1, если будет достигнут конец потока.
Наконец, можно прочитать заданное число символов в массив с использованием смещения:
// прочитать 100 символов
будет меньше
int nChars = 100;
chr [] CharArray = new char[nChars];
int nCharsRead = sr.Read(CharArray, 0, nChars);
nCharsReadnChars
, если запрос чтения потребует больше символов, чем осталось в файле.
- Работа с StreamWriter и StreamReader
- Пример: базовый клиент Web
- Mounting a Partition as Read-Only on a Running System
- Working with Files Using the File and FileInfo Classes
- The Stream Class
- Compressions for Stream Objects
- Building the RSS Reader Application
- 16.2. Неблокируемые чтение и запись: функция str_cli (продолжение)
- Чтение из текстового файла
- 4.1. Создание потока
- 13.4. Альтернативы read() и write()