Даже когда я уже неплохо умел педалить, я никак не мог запомнить иерархию наследования и то, как использовать классы вроде Stream, StreamWriter, HttpWriter в .Net. Решил это простым способом — выписал их все (основные), написал пару слов о каждом.
Для тех, кому тема знакома совсем ничего ничего нового тут не будет.
Вот такие мы имеем основные классы:
Предоставляет универсальное представление последовательности байтов.
Создает поток, резервным хранилищем которого является память.
И читает, и пишет.
Такое себе средство для обращения с 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 = 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).
Надстройка на Stream, позволяющая читать (только читать) символы, а не байты.
Представляет средство чтения, позволяющее считывать последовательные наборы знаков.
Кусок кода:
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 прыгает – потому что данные заносятся в буфер.
Кусок кода:
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();
Представляет средство записи, позволяющее записывать последовательные наборы символов.
Надстройка над 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();
Еще одна надстройка. Теперь над 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 намного удобнее, но указанные классы, по сути, являются дальнейшими надстройками к этой конструкции.
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();
}
}
Для тех, кому тема знакома совсем ничего ничего нового тут не будет.
Вот такие мы имеем основные классы:
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();
}
}