Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






Присоединение массива байтов к классам 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);

}

}

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.