- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания C# для профессионалов. Том II - Симон Робинсон
Шрифт:
Интервал:
Закладка:
□ Эти классы реализуют методы для чтения или записи одной строки текста за раз (StreamReader.ReadLine() и StreamWriter.WriteLine()). В случае чтения, это значит, что поток будет автоматически определять, где находится следующий перевод каретки, и остановит чтение в этой точке. В случае записи это означает, что поток будет автоматически добавлять комбинацию возврата каретки-перевода строки в записываемый текст.
□ При использовании классов StreamReader и StreamWriter не нужно беспокоиться об использованном в файле кодировании. Кодирование означает формат, который имел текст в содержащем его файле. Возможное кодирование включает ASCII (1 байт для каждого символа), или любой из форматов на основе Unicode, UTF7 и UTF8. Текстовые файлы в системах Windows 9х всегда являются ASCII, так как Windows 9х не поддерживает Unicode, и поэтому текстовые файлы могут теоретически содержать данные Unicode, UTF7 или UTF8 вместо данных ASCII. Соглашение состоит в том, что если файл имеет формат ASCII, значит он содержит текст. Если же любой из форматов Unicode, то он будет указан первыми двумя или тремя байтами файла, которые содержат определенную комбинацию значений для указания формата. Эти байты называются маркерами кода байтов. Когда файл открывается с помощью любого стандартного оконного приложения, такого как Notepad или WordPad, то не нужно беспокоиться об этом, так как эти приложения знакомы с различными методами кодирования и автоматически правильно считывают файл. Это также случай для класса StreamReader, который будет правильно считывать файл в любом из этих форматов, в то время как класс StreamWriter способен форматировать текст, который он записывает, с помощью любой запрошенной техники кодирования. С другой стороны, если требуется прочитать и вывести текстовый файл с помощью класса FileStream, придется все это выполнять самостоятельно.
Класс 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);
nCharsRead будет меньше nChars, если запрос чтения потребует больше символов, чем осталось в файле.
Класс StreamWriter
Он работает практически таким же образом, как и StreamReader, за исключением того только, что StreamWriter используется для записи в файл (или в другой поток). Возможности создания StreamWriter включают в себя:
StreamWriter sw = new StreamWriter(@"C:My DocumentsReadMe.txt");
Приведенный выше код будет использовать кодирование UTF8, которое рассматривается в .NET как метод кодирования по умолчанию. Если желательно определить альтернативное кодирование:
StreamWriter sw = new StreamWriter(@"C:My DocurnentsReadMe.txt", true, Encoding.ASCII);
В этом конструкторе вторым параметром является Boolean, который указывает, должен ли файл быть открыт для добавления. Странно, но не существует конструктора, который получает только имя файла и класс кодирования.
Конечно, можно соединить StreamWriter с файловым потоком, чтобы предоставить больший контроль над параметрами открытия файла:
FileStream fs = new FileStream(@"C:Му DocumentsReadMe.txt",
FileMode.CreateNew, FileAcces.Write, FileShare.ShareRead);
StreamWriter sw = new StreamWriter(fs);
FileInfo не реализует никаких методов, которые возвращают StreamWriter. Альтернативно, если вы захотите создать новый файл и начать записывать в него данные, то может оказаться полезной такая последовательность действий:
FileInfo MyFile = new FileInfo(@"C:My DocumentsNewFile.txt");
StreamWriter sw = MyFile.CreateText();
Так же, как и со всеми другими потоковыми классами, важно закрыть StreamWriter, когда работа закончена:
sw.Close();
Запись в поток делается с помощью любого из четырех перегружаемых методов StreamWriter.Write(). Простейший из них записывает строку и дополняет ее комбинацией возврат каретки — перевод строки:
string NextLine = "Groovy Line";
sw.Write(NextLine);