![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Файлы в оперативной памяти
Присоединение массива байтов к классам StreamReader или StreamWriter. Класс MemoryStream
Иногда удобно создать модель файла в ОП. В этом случае нужно заменить открытие файла на создание потока в памяти. Класс MemoryStream определяет поток байтов в оперативной памяти (см. рис.1). Класс MemoryStream — это реализация класса Stream.
рис.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: 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
Считываем данные посредством объекта 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);
Классы StringReader и StringWriter Если удобнее работать не с массивом байтов в ОП (класс MemoryStream), а с массивом строк, то целесообразно использовать классы StringReader и StringWriter (наследники классов TextReader и TextWriter).
Конструкторы:
StringReader (string str);
StringWriter();
Строка особого формата автоматически создается конструктором StringWriter().
using System; using System.IO; class StrRdrDemo { public static void Main() {
// Создаем объект класса StringWriter. StringWriter strWtr = new StringWriter(); // Записываем данные в StringWriter-объект. for (int i = 0; i < 10; i++) strWtr.WriteLine (" Значение i равно: " + i);
// Создаем объект класса StringReader. StringReader strRdr = new StringReader (strWtr.ToString());
string str; do { str = strRdr.ReadLine(); // Считываем данные из StringReader-объекта. Console.WriteLine(str); } while (str! = null); } }
|