Поиск…
Использование потоков
Поток - это объект, который обеспечивает низкоуровневое средство для передачи данных. Они сами не действуют как контейнеры данных.
Данные, с которыми мы имеем дело, находятся в форме байтового массива ( byte []
). Функции для чтения и записи ориентированы по WriteByte()
, например WriteByte()
.
Нет функций для работы с целыми числами, строками и т. Д. Это делает поток очень универсальным, но менее простым в работе, если, скажем, вы просто хотите передать текст. Потоки могут быть особенно полезными, когда вы имеете дело с большим объемом данных.
Нам нужно будет использовать другой тип Stream, на котором он должен быть записан / прочитан (т. Е. Хранилище резервных копий). Например, если источником является файл, нам нужно использовать FileStream
:
string filePath = @"c:\Users\exampleuser\Documents\userinputlog.txt";
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
// do stuff here...
fs.Close();
}
Аналогично, MemoryStream
используется, если резервным хранилищем является память:
// Read all bytes in from a file on the disk.
byte[] file = File.ReadAllBytes(“C:\\file.txt”);
// Create a memory stream from those bytes.
using (MemoryStream memory = new MemoryStream(file))
{
// do stuff here...
}
Аналогично, System.Net.Sockets.NetworkStream
используется для доступа к сети.
Все потоки выводятся из общего класса System.IO.Stream
. Данные не могут быть непосредственно прочитаны или записаны из потоков. .NET Framework предоставляет вспомогательные классы, такие как StreamReader
, StreamWriter
, BinaryReader
и BinaryWriter
которые преобразуют между родными типами и интерфейсом потока низкого уровня и переносят данные в поток или из потока для вас.
Чтение и запись в потоки можно выполнять с помощью StreamReader
и StreamWriter
. Будьте осторожны, закрывая их. По умолчанию закрытие также закрывает поток, содержащийся в потоке, и делает его непригодным для дальнейшего использования. Это поведение по умолчанию может быть изменено с помощью конструктора, который имеет параметр bool leaveOpen
и устанавливает его значение как true
.
StreamWriter
:
FileStream fs = new FileStream("sample.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
string NextLine = "This is the appended line.";
sw.Write(NextLine);
sw.Close();
//fs.Close(); There is no need to close fs. Closing sw will also close the stream it contains.
StreamReader
:
using (var ms = new MemoryStream())
{
StreamWriter sw = new StreamWriter(ms);
sw.Write(123);
//sw.Close(); This will close ms and when we try to use ms later it will cause an exception
sw.Flush(); //You can send the remaining data to stream. Closing will do this automatically
// We need to set the position to 0 in order to read
// from the beginning.
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
var myStr = sr.ReadToEnd();
sr.Close();
ms.Close();
}
Поскольку классы Stream
, StreamReader
, StreamWriter
и т. Д. IDisposable
интерфейс IDisposable
, мы можем вызвать метод Dispose()
для объектов этих классов.