Файлы в оперативной памяти
Присоединение массива байтов к классам 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);
}
}
}
Вот как выглядят результаты выполнения
этой программы: Считываем данные прямо из массива 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);
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.