使用 Streams
流是一種提供傳輸資料的低階方法的物件。它們本身並不充當資料容器。
我們處理的資料是位元組陣列(byte []
)的形式。讀取和寫入的功能都是以位元組為導向的,例如 WriteByte()
。
沒有用於處理整數,字串等的函式。這使得流非常通用,但是如果你只是想傳輸文字,則不太簡單。在處理大量資料時,Streams 可能特別有用。
我們需要使用不同型別的 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
用於網路訪問。
所有 Streams 都來自通用類 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
介面,我們可以在這些類的物件上呼叫 Dispose()
方法。