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