Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Работа с FileStream

Работа с FileStream

Класс FileStream обеспечивает реализацию абстрактных членов Stream в виде, подходящем для файловых потоков. Это довольно примитивный поток – он может читать или записывать только один байт или массив байтов. На самом деле необходимость непосредственного взаимодействия с членами типа FileStream возникает очень редко. Вы чаще будете использовать различные упаковщики потоков, которые упрощают работу с текстовыми данными или типами .NET. Однако для примера давайте поэкспериментируем со средствами синхронного чтения/записи типа FileStream.

Предположим, что мы создали новое консольное приложение FileStreamApp. Нашей целью является запись простого текстового сообщения в новый файл с именем myMessage.dat. Но поскольку FileStream может воздействовать только на отдельные байты, требуется перевести тип System.String в соответствующий массив байтов. К счастью, в пространстве имен System.Text определяется тип Encoding, предлагающий члены, которые выполняют кодирование и декодирование строк и массивов байтов (для подробного описания типа Encoding обратитесь к документации .NET Framework 2.0 SDK).

После выполнения кодирования массив байтов переводится в файл с помощью метода FileStream.Write(). Чтобы прочитать байты обратно в память, необходимо переустановить внутренний указатель позиции потока (с помощью свойства Position) и вызвать метод ReadByte(). Наконец, массив байтов и декодированная строка выводятся на консоль. Вот полный текст соответствующего метода Main().

// Не забудьте 'использовать' System.Text.
static void Main(string[] args) {
 Console.WriteLine("***** Забавы с FileStreams *****n");
 // Получение объекта FileStream.
 FileStream fStream = File.Open(@"C:myMessage.dat", FileMode.Create);
 // Кодирование строки в виде массива байтов.
 string msg = "Привет!";
 byte[] msgAsByteArray = Encoding.Default.GetBytes(msg);
 // Запись byte[] в файл.
 fStream.Write(msgAsByteArray, 0, msgAsByteArray.Length);
 // Переустановка внутреннего указателя позиции потока.
 fStream.Position = 0;
 // Чтение типов из файла и вывод на консоль….
 Console.Write("Ваше сообщение в виде массива байтов: ");
 byte[] bytesFromFile = new byte[msgAsByteArray.Length];
 for (int i = 0; i ‹ msgAsByteArray.Length; i++) {
  bytesFromFile[i] = (byte)fStream.ReadByte();
  Console.Write(bytesFromFile[i]);
 }
 // Вывод декодированного сообщения.
 Console.Write("nДекодированное сообщение: ");
 Console.WriteLine(Encoding.Default.GetString(bytesFromFile));
 // Завершение потока.
 fStream.Close();
}

Хотя в этом примере файл данными не заполняется, уже здесь становится очевидным главный недостаток работы с типом FileStream: приходится воздействовать непосредственно на отдельные байты. Другие типы, являющиеся производными от Strеаm, работают аналогично. Например, чтобы записать последовательность байтов в заданную область памяти, можно использовать MemoryStream. Точно так же, чтобы передать массив байтов по сети, вы можете использовать тип NetworkStream.

К счастью, пространство имен System.IO предлагает целый ряд типов "чтения" и "записи", инкапсулирующих особенности работы с типами, производными от Stream.

Исходный код. Проект FileStreamApp размещен в подкаталоге, соответствующем главе 16.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.135. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз