Как стать автором
Обновить

Шпора на контрольную по теме «Класс Stream и произодные от него в .Net»

Время на прочтение4 мин
Количество просмотров3.7K
Даже когда я уже неплохо умел педалить, я никак не мог запомнить иерархию наследования и то, как использовать классы вроде Stream, StreamWriter, HttpWriter в .Net. Решил это простым способом — выписал их все (основные), написал пару слов о каждом.
Для тех, кому тема знакома совсем ничего ничего нового тут не будет.


Вот такие мы имеем основные классы:

Stream

– abstract
Предоставляет универсальное представление последовательности байтов.

MemoryStream


Создает поток, резервным хранилищем которого является память.
И читает, и пишет.
Такое себе средство для обращения с byte[].

Кусок кода:

byte[] buffer = new byte[] {11,12,13,14,15,16,17,18,19,20};
byte[] buffer2 = new byte[] {21,22,23};

MemoryStream memStream = new MemoryStream(buffer);
memStream.WriteByte(66);
memStream.WriteByte(77);

int adsfs = memStream.ReadByte();
int adsfs2 = memStream.ReadByte();

memStream.Position = 5;
memStream.Write(buffer2, 0, 2);

memStream.Seek(2, SeekOrigin.Current);

Интересно, что и read и write одинаково двигают позицию в стриме на кол-во записанных/прочитанных байт.

FileStream


Все то же самое, только пишем/читаем из файла
Кусок кода:

FileStream fileStream = new FileStream(«file33.txt», FileMode.Open);
byte[] buffer2 = new byte[] { 71, 72, 73 };

var b1 = fileStream.ReadByte();
var b2 = fileStream.ReadByte();
var b3 = fileStream.ReadByte();

fileStream.WriteByte((byte)b3);
fileStream.WriteByte((byte)b3);

//and all the properties
var b = fileStream.CanRead;
b = fileStream.CanWrite;
b = fileStream.CanSeek;

fileStream.Position = 106;
fileStream.Write(buffer2, 0, 3);

fileStream.Seek(1, SeekOrigin.End);
fileStream.WriteByte(76);
fileStream.WriteByte(76);
fileStream.WriteByte(76);
fileStream.WriteByte(76);

ReadByte() возвращает int, чтобы понять, когда чтение было неудачным (-1).

TextReader

– abstract
Надстройка на Stream, позволяющая читать (только читать) символы, а не байты.
Представляет средство чтения, позволяющее считывать последовательные наборы знаков.

StreamReader


Кусок кода:

byte[] buffer = new byte[] {71,72,73,74,75,76,77,78,79,80, 80,80,80};

byte[] buffer2 = new byte[] {81,82,83};

MemoryStream memStream = new MemoryStream(buffer);
using (StreamReader strReader = new StreamReader(memStream))
{
var sd = strReader.Peek();
var sdd = strReader.Peek();
var sded = strReader.Peek();

var dasd = strReader.Read();
string s = ((char)dasd).ToString();

var das2d = strReader.Read();
var das3d = strReader.Read();

strReader.BaseStream.Position = 8;

var vsd = strReader.ReadToEnd();
}

Все теперь просто, кроме того, что Position прыгает – потому что данные заносятся в буфер.

StringReader


Кусок кода:

string s=«SDAFASDF A F dfsdfsd fas»;
StringReader stringReader = new StringReader(s);
var sdf = stringReader.Read();
var sddf = stringReader.Read();
var sddasdf = stringReader.Read();
var sdsssf = stringReader.Read();
var sdfaa = stringReader.Read();
var sdfg= stringReader.ReadLine();

TextWriter

– abstract
Представляет средство записи, позволяющее записывать последовательные наборы символов.

StreamWriter


Надстройка над Stream для записи в поток. Производный от абстракного TextWriter

Кусок кода:

FileStream fileStream = new FileStream(«file33.txt», FileMode.Open);
fileStream.Seek(1, SeekOrigin.End);

StreamWriter strWriter = new StreamWriter(fileStream);

strWriter.Write(«sad»);
strWriter.WriteLine(«sad»);
strWriter.Write(«sad»);
strWriter.Close();

Position у Stream не изменяется при записи.
Кусок кода:

byte[] buffer = new byte[] { 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 80, 80, 80 };

MemoryStream memStream = new MemoryStream(buffer);

StreamWriter strWriter = new StreamWriter(memStream);

strWriter.Write(«sad»);
// strWriter.Write(«sasfagfsdghs h dfhdh d hd ddf d»);

strWriter.Close();

XmlReader


Еще одна надстройка. Теперь над TextReader. Может инициализироваться как стрингом, как стримом, там и текстридером.
Кусок кода:

FileStream fileStream = new FileStream(«file1.txt», FileMode.Open);

XmlReader reader = XmlReader.Create(fileStream);

StringBuilder output = new StringBuilder();
XmlWriter writer = XmlWriter.Create(output);

// Parse the file and display each of the nodes.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
writer.WriteStartElement(reader.Name);
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
break;
case XmlNodeType.Comment:
writer.WriteComment(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
}

}

writer.Close();

Довольно по-странному (но вроде как быстрее всех) читает xml. Я имею в виду, что Xdocument или XMLDocument намного удобнее, но указанные классы, по сути, являются дальнейшими надстройками к этой конструкции.

XmlWriter


Represents a reader that provides fast, non-cached, forward-only access to XML data.
Надстройка над TextWriter (StreamWriter) с методами такого типа:
Кусок кода:

using (XmlWriter writer = XmlWriter.Create(xmlFile, settings))
{
writer.WriteStartDocument(false);
writer.WriteComment(«This is a comment.»);
writer.WriteStartElement(«books»);
writer.WriteStartElement(«book»);
writer.WriteElementString(«id»,«1»);
writer.WriteElementString(«name», «Apple Training Series: GarageBand 09»);
writer.WriteElementString(«author», «Mary Plummer»);
writer.WriteElementString(«price»,"$39.99");
writer.WriteEndElement();
writer.WriteEndElement();
writer.Flush();
}
}
Теги:
Хабы:
Всего голосов 27: ↑7 и ↓20-13
Комментарии1

Публикации

Работа

.NET разработчик
44 вакансии

Ближайшие события