【转】C# 数据流详解(FileStream、MemoryStream、NetworkStream等类)
本文章內容主要為數據流及相關輔助類:
流(Stream)、文件流(FileStream)、內存流(MemoryStream)、網絡流(NetworkStream)、加密流(CryptoStream)以及文本讀寫的StreamReader、StreamWriter、用于二進制讀寫的BinaryReader和BinaryWriter類等。
對FileStream、MemoryStream、NetworkStream有一定的了解即可,重點熟練StreaReader、StreamWriter、BinaryReader和BinaryWirter即可。
目錄
數據流
數據流的操作
分類
Stream
FileStream
MemoryStream
NetworkStream
CryptoStream
StreamReader
StreamWriter
BinaryReader
BinaryWirter
數據流
數據流(data stream)是一組有序,有起點和終點的字節的數據序列。在C#里,數據流提供了一種通用的方式和字節隊列進行交互。
數據流的操作
- 逐字節順序寫入(將數據從內存緩沖傳出到外部資源)
- 逐字節順序讀取(將數據從外部數據資源傳輸到內存緩沖區)
- 隨機讀寫(從某個位置開始逐字順序讀寫)
分類
- 根據數據源的類型(C#語言采用這種方式進行分類)
分為文件流(FileStream)、內存流(MemoryStream)、網絡流(NetworkStream)、加密流(CryptoStream)。
- 根據讀寫數據的類型
分為字節流和字符流
- 根據輸入輸出方向
輸入流和輸出流
Stream
流,在System.IO命名空間下,是所有數據流的基類,抽象類無法創建實例。
Position:獲取或設置流當前的位置
Length:以字節為單位流的長度
CanWriter:當前流是否支持寫入
CanTimeout:當前流是否超時
CanSeek:當前流是否支持查找,當CanSeek為false的時候,是不允許使用Position屬性和調用Seek函數的,會拋出異常。
CanRead:當前流是否可讀
Synckronized:根據當前流創建一個線程安全的的流對象
Close:關閉流并釋放相關資源。
FileStream
文件流,在System.IO命名空間下,用于對各種類型的文件進行讀寫。
必須調用Dispose進行資源釋放。
創建FileStream:FileStream構造函數之外,也可以通過File.OpenWrite和File.OpenRead創建FileStream對象
Flush:清除流的緩沖區,將已經緩沖的數據寫入文件中。
Lock:鎖定當前流,防止其他進程對文件進行讀寫。
UnLock:解除鎖定,允許其他進程對文件進行讀寫。
SetLength:設置流的長度。
Read:讀取一個一個字節塊,并寫入給定的緩沖區,offset是數組的偏移量,coun為讀取的字節長度。每當讀取一個字節后Position會增加1。放返回值為每次讀取到的實際字節數。
Seek:設置流的偏移量,offset 偏移量,origin是指定偏移量的參考位置,開始位置、結束位置、當前位置。
MemoryStream
內存流,在System.IO命名空間下,對保存在內存中的字節數組進行操作。由于內存流的容量可以自動增長,因此在數據加密以及對長度不定的數據進行緩存等場合使用。
Capacity:獲取或設置為此流分配的字節數
GetBuffer:獲取流中的無符號字節數組,返回的是分配給流空間大小的字節數組(也就是Capacity大小的字節數組),而不是實際占用了的字節數組。
NetworkStream
網絡流,在System.Net.Sockets命名空間下,利用該類可以通過網絡發送或接收數據。可以將NetworkStream看作在數據源和接收端之間架設了一個數據通道,讀取和寫入就可以針對通道來進行。
NetworkStream僅支持面向連接的套接字,也就是采用TCP協議的連接。
創建NetworkStream:構造函數參數為Socket對象或調用TcpClient對象GetStream方法得到NetworkStream
Position:網絡流無法訪問該屬性會拋出異常
CanSeek:始終返回false
Seek:網絡流無法調用該函數會拋出異常。
DataAvailable:查看緩沖區(數據緩沖區)中是否有數據等待讀出。
Write:將字節數組從進程緩沖區寫入到TCP發送緩沖區,Write為同步方法,會阻塞線程直到發送成功或返回異常位置。
Read:將字節數組從TCP接收緩沖區讀出到進程緩沖區,調用Read之前應先判斷DataAvailable屬性是否為true。
CryptoStream
加密流,在System.Security.Cryptography命名空間下,該類可加密流的方式加密或者解密數據,而且只能用于對稱加密。
實現任何CryptoStream的任何被加密對象都可以和實現Stream的任何對象鏈接起來,因此一個對象的流式處理輸出可以饋送到另一個對象的輸入,而不需要分別存儲中間結果。
Read:將需要解密的流寫入到字節數組中,字節數組是已經解密的。
Write:將需要進行加密的流寫入到字節數組中,字節數組中的數據是已經被加密的。
FlushFinalBlock:將內部緩沖區的數據進行寫入并清空緩沖區。調用Flush無效。
StreamReader
繼承自TextReader,在System.IO命名空間下。對文本數據進行讀取操作時使用該類。
創建StreamReader:構造函數,參數使用FileStream、NetworkStream、MemoryStream的對象或使用文件路徑。
Close:讀寫完成后必須使用CLose進行流的關閉.
BaseStream:獲取對應的底層流,也就是創建StreamWriter或StreamReader時使用的Stream對象。
CurrentEncoding:獲取當前流設置的編碼格式。
ReadToEnd:從底層流的Position開始讀取字符到結束為止
EndOfStream:獲取底層流的Position是否為末尾為止。
StreamWriter
繼承自TextWriter,在System.IO命名空間下。對文本數據進行寫入操作時使用該類。
創建StreamWriter:除構造函數外,調用File.CreateText、FileInfo.CreateText均可以獲取StreamWriter對象。
AutoFlush:是否在調用Write函數后自動調用Flush函數將字符緩沖到底層流。
Flush:清除當前寫入器的所有緩沖區,并使任何已緩存的數據變寫入底層流。
BinaryReader
在System.IO命名空間下,對圖像文件、壓縮文件等二進制數據進行讀取操作時使用該類。
BinaryWirter
在System.IO命名空間下,對圖像文件、壓縮文件等二進制數據進行寫入操作時使用該類。
總結
以上是生活随笔為你收集整理的【转】C# 数据流详解(FileStream、MemoryStream、NetworkStream等类)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone 14前摄迎来史诗升级:6P
- 下一篇: 代办信用卡提额靠谱吗