Файлы в оперативной памяти Присоединение массива байтов к классам StreamReader или StreamWriter. Класс MemoryStream

  • docx
  • 18.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-002146.docx

Файлы в оперативной памяти

Присоединение массива байтов к классам StreamReader или

StreamWriter.

Класс MemoryStream

 

Иногда удобно создать модель файла в ОП. В этом случае нужно за- менить открытие файла на создание потока в памяти.

Класс MemoryStream определяет поток байтов в оперативной памяти

(см. рис.1). Класс MemoryStream это реализация класса Stream.

 

 

StreamReader / StreamWriter

 


 

байт, байт,…


MemoryStream

 

Байтовый поток


байт, байт, …


 

 

 

 

 

 

 

 

 

ПРОГРАММА

рис.1

Для работы с этим потоком могут использоваться классы StreamReader и StreamWriter. С помощью их методов можно считывать входные данные из массива байтов или записывать их в массив.

Один из конструкторов класса MemoryStream:

 

MemoryStream (byte[ ] buf)

 

buf — это массив байтов, который предполагается использовать в операциях ввода-вывода в качестве источника и/или приемника инфор- мации.

       Поток доступен как на чтение, так и на запись.

       В поток, создаваемый этим конструктором, можно записывать данные или считывать их из него.

       Перед использованием этого конструктора необходимо позабо- титься о достаточном размере массива buf, чтобы он позволил со- хранить все направляемые в него данные.

       Этот поток поддерживает метод Seek(), который позволяет перед выполнением чтения/записи сместиться к любому байту массива.


Пример:

 

// Демонстрация использования класса MemoryStream. using System;

using System.IO; class MemStrDemo

{

public static void Main()

{

byte[ ] storage = new byte[255];                  // Модель файла

 

// Создаем поток с ориентацией на память. MemoryStream mem = new MemoryStream (storage);

 

// Помещаем объект mem в оболочку StreamWriter. StreamWriter memWtr = new StreamWriter (mem);

 

// Записываем данные в память с помощью объекта memWtr. for (int i = 0; i < 10; i++)

memWtr.WriteLine ("byte [{0}]: {0}", i);

 

memWtr.Write ('.');        // Ставим в конце точку. memWtr.Flush ();                // Форсируем вывод

 

 

Console.WriteLine ("Считываем данные прямо из массива storage: ");

 

// Отображаем напрямую содержимое памяти. foreach (char ch in storage)

{


 

ки.


if (ch == '.') break;      // После точки будет EOF, который является концом стро-

 

Console.Write (ch);

}


 

Console.WriteLine("\nСчитываем данные посредством объекта memRdr: ");

 

// Помещаем объект mem в оболочку StreamReader. StreamReader memRdr = new StreamReader (mem);

// Считываем данные из объекта mem, используя средство чтения потоков. mem.Seek (0, SeekOrigin.Begin); // Установка указателя позиции

// в начало потока.

string str = memRdr.ReadLine();

 

while (str != null)

{

str = memRdr.ReadLine();

if (str.CompareTo(".") == 0) break; // После точки следует EOF,

// поэтому точка считыва-

ется как строка.

Console.WriteLine(str);

}


}

}

 

byte	[0] : 0
byte	[1] : 1
byte	[2] : 2
byte	[3] : 3
byte	[4] : 4
byte	[5] : 5
byte	[6] : 6
byte	[7] : 7
byte	[8] : 8
byte	[9] : 9

Вот как выглядят результаты выполнения этой программы: Считываем данные прямо из массива storage:

 

 

 

 

 

 

 

 

Считываем данные посредством объекта memRdr:

byte

[0] : 0

byte

[1] : 1

byte

[2] : 2

byte

[3] : 3

byte

[4] : 4

byte

[5] : 5

byte

[6] : 6

byte

[7] : 7

byte

[8] : 8

byte

[9] : 9

 

Вместо

mem.Seek (0, SeekOrigin.Begin);

 

можно применить

memWtr.Close();

mem = new MemoryStream (storage);