
Классы BinaryReader и BinaryWriter
Кроме байтовых и символьных потоков в языке C# реализованы двоичные потоки для работы с примитивными типами данных, такими как int, double, short и др. Двоичные потоки хранят значения в двоичном коде и не предназначены для просмотра их человеком.
Двоичный поток открывается на основе базового потока, который, в частности может быть инициализирован с помощью класса FileStream.
Так конструктор BinaryReader(<ИмяБазовогоПотока>) открывает двоичный поток для считывания данных из файла, ассоциированного с заданным базовым потоком.
Некоторые свойства и методы класса BinaryReader приведены в таблице 5.
Таблица 10.5
Свойства и методы класса BinaryReader
Название |
Вид |
Описание |
BaseStream |
неизменяемое свойство |
Предоставляет доступ к базовому потоку |
Close() |
экземплярный метод |
Закрывает текущий и связанный с ним базовый поток |
PeekChar() |
экземплярный метод |
Возвращает следующий доступный для чтения символ в формате int, не перемещая внутренний указатель текущего положения в потоке. Если доступного для чтения символа нет, возвращает значение –1 |
Read() |
экземплярный метод |
Считывает текущий символ из базового потока и перемещает внутренний указатель потока на один символ, либо возвращает значение –1, если доступных для чтения символов нет |
Метод Read() перегружен и имеет несколько вариантов реализации. Так, его можно использовать для считывания из базового потока последовательности байтов определенной длины и записи их в одномерный массив с указанного индекса; метод при этом возвращает количество считанный из потока байт, либо ноль, если достигнут конец потока. Также метод Read() может считывать из базового потока последовательность символов.
Кроме того, в классе BinaryReader определены методы, реализующие считывание из базового потока значений всех встроенных в C# примитивных типов. Синтаксис таких методов одинаков и имеет вид: ReadXX(), где вместо XX указывается соответствующий тип данных. Например, метод ReadBoolean() считывает из базового потока величину типа Boolean (bool) и перемещает внутренний указатель потока на соответствующее количество байт вперед в зависимости от типа считанной величины, в данном случае на один байт.
Конструктор BinaryWriter(<ИмяБазовогоПотока>) открывает двоичный поток для записи данных в файл, ассоциированный с заданным базовым потоком. Основные методы приведены в таблице 10.6.
Таблица 10.6
Методы класса BinaryWriter
Название |
Описание |
Flush() |
Записывает данные из буфера в связанный с потоком источник данных (файл) и очищает буфер |
Seek() |
Устанавливает позицию указателя в текущем потоке (имеет тот же синтаксис, что и аналогичный метод класса Stream) |
Write() |
Записывает заданное значение в текущий поток |
Close() |
Закрывает текущий и связанный с ним базовый поток |
Приведем пример записи в файл и чтения из файла данных разных типов с использованием двоичных потоков.
try
{
FileStream MyFile = new FileStream("input.txt", FileMode.Create,
FileAccess.Write);
BinaryWriter MyBinaryFile = new BinaryWriter(MyFile);
MyBinaryFile.Write("Ivanov");
MyBinaryFile.Write("PM-11");
MyBinaryFile.Write(1);
MyBinaryFile.Write(true);
MyBinaryFile.Write("Petrov");
MyBinaryFile.Write("PM-21");
MyBinaryFile.Write(2);
MyBinaryFile.Write(false);
MyBinaryFile.Close();
}
catch
{
Console.WriteLine("Ошибка ввода");
}
Здесь мы записываем в двоичный поток информацию о двух студентах: фамилию, группу, курс и логическую величину, указывающую, проживает ли студент в общежитии.
Считывание введенных таким образом данных в файл, можно организовать следующим образом:
try
{
FileStream MyFile = new FileStream("input.txt", FileMode.Open,
FileAccess.Read);
BinaryReader MyBinaryFile = new BinaryReader(MyFile);
Console.Write("Name: " + MyBinaryFile.ReadString());
Console.Write("\tGroup: " + MyBinaryFile.ReadString());
Console.Write("\tCourse: " + MyBinaryFile.ReadInt32());
Console.WriteLine("\tLiving in a hostel: " +
MyBinaryFile.ReadBoolean());
Console.Write("Name: " + MyBinaryFile.ReadString());
Console.Write("\tGroup: " + MyBinaryFile.ReadString());
Console.Write("\tCourse: " + MyBinaryFile.ReadInt32());
Console.WriteLine("\tLiving in a hostel: " +
MyBinaryFile.ReadBoolean());
MyBinaryFile.Close();
}
catch
{
Console.WriteLine("Ошибка ввода");
}
Отметим, что для проверки работоспособности программы, считанные из файла данные, выводятся на экран, поскольку файлы, созданные с помощью класса BinaryWriter, не предназначены для просмотра человеком, а обычно создаются для использования в программах.