Ввод и вывод в .NET. Потоковые классы.
Грубо обобщая, можно разделить функции ввода/вывода в каркасе .NET Framework на две широких категории, не зависящих от устройства хранения данных (диск, память, и т.д.): это запись и чтение.
Данные могут рассматриваться как поток байтов или символов. Например, мы могли прочитать 500 байтов из файла, и записать их в буфер памяти. Данные также можно рассматривать как набор объектов. Чтение и запись объектов называются соответственно преобразованием из последовательной формы в параллельную и преобразованием в последовательную форму (сериализацией). Мы можем сериализировать (записать) список объектов типа Customer (Клиент) на диск. Затем мы можем список объектов Customer (Клиент) преобразовать из последовательной формы в параллельную, т.е. прочитать этот список обратно в память.
В пространстве имен System::IO есть несколько классов для чтения и записи, позволяющих использовать различные устройства хранения, если только данные можно трактовать как байты или символы. Функциональные возможности сериализации могут проявляться в различных местах каркаса .NET. Пространство имен System::Runtime::Serialization (Система-Время выполнения::Сериализация) используется для сериализации в общей системе типов (Common Type System). Пространство имен System::Xml::Serialization (Система::Хml::Сериализация) используется для сериализации XML-документов.
Потоковые классы
Stream (Поток, Абстрактный последовательный файл) – абстрактный класс, который является базовым для чтения и записи байтов в некоторое хранилище данных типа файла. Этот класс поддерживает синхронные и асинхронные чтение и запись. Асинхронные методы обсуждаются позже в данной главе. Класс Stream (Поток, Абстрактный последовательный файл) содержит типичные и вполне ожидаемые от такого класса методы: Read (Чтение), Write (Запись), Seek (Поиск), Flush (Дозапись) и Close (Закрыть).
Класс FileStream, который является производным от класса Stream (Поток, Абстрактный последовательный файл), предоставляет операции чтения и записи последовательности байтов в файл. Конструктор FileStream создает экземпляр потока. Перегруженные методы класса Stream (Поток, Абстрактный последовательный файл) осуществляют чтение и запись в файл.
У класса Stream (Поток, Абстрактный последовательный файл) есть и другие производные классы: MemoryStream, BufferedStream и NetworkStream (в System::Net::Sockets (Система::Сеть::Сокеты)).
Пример FileStream (в папке FilelO с примерами ввода/вывода) иллюстрирует, как использовать потоковый класс Stream (Поток, Абстрактный последовательный файл). Если файл не существует, создается новый, а потом в этот файл записываются числа от 0 до 9. Если файл уже существует, программа читает 5 байтов в конце файла и затем выводит их на консоль. (Пример нужно выполнить дважды. Первый раз программа создаст файл и запишет в него числа, а во второй раз прочитает и распечатает часть файла).
unsigned char data _gc[] = // сборщик мусора – данные – символы без знака new unsigned char _gc [10]; // сборщик мусора – новый символ без знака FileStream *fs = new FileStream( "FileStreamTest.txt", FileMode::OpenOrCreate); if (fs › Length == 0) // если Длина == 0 { Console::WriteLine("Writing Data…"); // Запись данных for (short i = 0; i < 10; i++) data[i] = (unsigned char)i; // данные = символ без знака fs › Write(data, 0, 10); // Запись данных } else { fs › Seek(-5, SeekOrigin::End); // Ищем конец int count = fs › Read(data, 0, 10); // Чтение данных for (int i = 0; i < count; i++) // счет { Console::WriteLine(data[i]); // данные } } fs › Close();