C# Stream 本質



C#中的Stream,文件,編碼等


本文行文有點亂,但每一句都是思考良久的結晶,如果您只是想了解一點技術上的具體問題,推薦msdn。


理論上,讀是把一堆本無意義的信息載體(如一串文字)轉換成有意義的概念(信息)的過程;寫是把一個有含義的概念用本無意義的信息載體記錄起來的過程。對應起流的概念:流是一種數碼信息的載體,它是沒有數據結構的一長串01序列;程序里用的數據是有良好數據結構的,相當於有含義的概念。


xxxStream.Read()是流的讀操作,把本無意義的流讀成程序里使用的有意義的數據;
xxxStream.Write()是流的寫操作,把程序里的數據結構寫到流中。


流的讀寫與觀念上文件的讀寫不同。你編的軟件的職責並不包括直接操作文件,它只需要負責把特定的數據結構寫到流中即可,從流保存到文件的過程是后台調用文件系統完成的。


大塊數據在通信時都是轉換成流的形式的。一個流總會有一個來源,比如從文件,網絡,管道。流最終也會有一個去向,比如存成文件,發送到網絡(用發送出去說明這個過程更抽象,因為就算是以文件的形式保存,也是發送到文件系統,讓文件系統自己去處理)。所以一個流概念上對應一個你想操作的文件的實體(以文件流為例),因為你編程的時候不用思考文件系統里的具體操作。


File類和Directory類相當軟件虛擬了一個文件系統,而FileInfo類(xxxInfo類)相當於虛擬了一個(文件)實體。(其實一個文件實體我們只需要知道它的路徑和文件名就足夠了,這就是為什么FileInfo類的構造方法只需要一個全文件名)


在程序中,一個文件所能提供的只有:文件名,路徑名和一串流。所有對文件的操作都歸為對這三者的操作。一個FileInfo可以解決文件與路徑名,一個由路徑構建的FileStream實例可以解決流。


流的讀操作總需要把數據源以一串01序列的形式從數據源(以磁盤為例)讀到內存中的;寫操作總會把內存中的一長串01序列寫回數據源,如果每一次讀寫只針對很少的數據而讀寫的次數又過於頻繁,內存與磁盤間的往返就會造成性能上的問題。BufferedStream是給一般的Stream在內存里加了一個緩存,這樣對數據源的讀取就可以先批量讀到內存再訪問,寫操作也可以先批量放在內存再一並寫到數據源。


文件有兩大類:文本文件和二進制文件。文本文件存儲的是文本信息(一串文字符號),而文字符號本身是和編碼沒有關系的,存儲系統在試圖把文字符號保存起來的時候才涉及編碼。一個文本文件一方面在物質上是一個01序列的實體,另一方面在精神上是一串文字符號。具體說來,一個文本文件在存儲的時候先指定一種編碼方式,再把文件編碼,最后把編碼方式和碼塊一並存儲起來,所以,它借助公認編碼對外體現的就是那一串文字符號。有些時候軟件出現亂碼問題,要么是軟件不認識那個指定的編碼方式,要么是強制以不一致的編碼方式解碼導致。


FileStream的實例可以通過File或者FileInfoOpen方法得到,也可以通過構造函數傳入一個全文件名得到,可見它其實代表這個文件的數據實體。相比之下,FileInfo代表這個文件的操作實體。


一個流自身的讀寫方法Read()和Write()進行的是物理的讀寫,即讀寫的是流對應實體的字節數據塊。如果想對一個流代表的含義和內容進行讀寫,就要用XXXReader類和XXXWriter類了。


以下簡要地歸納了System.IO的主要類:


Stream:
支持讀取和寫入字節的抽象類。不管它具體是什么形式,本質上總是可以視為一串字節序列。


File, FileInfo, Directory, DirectoryInfo
提供抽象的FileSystemInfo類的具體實現,虛擬了文件系統。


FileStreamMemoryStreamNetworkStream
流的具體類。其中MemoryStream是一個非緩存的數據流,它封閉的數據在內存中可以直接訪問,作為一臨時緩存,它很有用。


BufferedStream
給像NetworkStream這樣的數據流添加了緩存的數據流。


TextReader, TextWriter, StringReader, StringWriterStreamReaderStreamWriter
向數據流中讀出或寫入編碼后的文本。其中StringReaderStringWriter把一段String視為流的源。


BinaryReader,BinaryWriter
向數據流中讀取和寫入編碼后的字符串或各種原始數據類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM