標籤:核心技術 files director 相互 衍生類別 long dir 開始 col
C# 溫故而知新:Stream篇(—)
http://www.cnblogs.com/JimmyZheng/archive/2012/03/17/2402814.html
基本概念重點看這一篇。
什麼是
Stream?
MSDN 中的解釋太簡潔了: 提供位元組序列的一般視圖
(我可不想這麼理解,這必定讓我抓狂,我理解的流是向自然界的河流那樣清澈而又美麗,c#中的流也是一樣,許多技術或者說核心技術都需要流的幫忙)
那什麼是位元組序列呢?
其實簡單的來理解的話位元組序列指的是:
位元組對象都被儲存為連續的位元組序列,位元組按照一定的順序進行排序組成了位元組序列
那什麼關於流的解釋可以抽象為下列情況:
打個比方:一條河中有一條魚遊過,這個魚就是一個位元組,這個位元組包括魚的眼睛,嘴巴,等組成8個二進位,顯然這條河就是我們的核心對象:流
*4: void Flush():這點必須說得仔細些:
當我們使用流寫檔案時,資料流會先進入到緩衝區中,而不會立刻寫入檔案,當執行這個方法後,緩衝區的資料流會立即注入基礎流
MSDN中的描述:使用此方法將所有資訊從基礎緩衝區移動到其目標或清除緩衝區,或者同時執行這兩種操作。根據對象的狀態,可能需要修
改流內的當前位置(例如,在基礎流支援尋找的情況下即如此)當使用 StreamWriter 或 BinaryWriter 類時,不要重新整理 Stream 基底物件。
而應使用該類的 Flush 或 Close 方法,此方法確保首先將該資料重新整理至基礎流,然後再將其寫入檔案。
(紅色部分為關鍵請大家務必能夠理解,今後會在相應的章節中介紹)
*9: abstract void Write(byte[] buffer,int offset,int count)
這個方法包含了3個關鍵的參數:緩衝位元組數組,位移偏量和讀取位元組個數
和read方法不同的是 write方法中的第一個參數buffer已經有了許多byte類型
的資料,我們只需通過設定 offset和count來將buffer中的資料寫入流中
*10: virtual void Close()
關閉流並釋放資源,在實際操作中,如果不用using的話,別忘了使用完流之後將其關閉
這個方法特別重要,使用完當前流千萬別忘記關閉!
C# 溫故而知新:Stream篇(
二)
http://www.cnblogs.com/JimmyZheng/archive/2012/03/19/2405216.html#no1
詳細介紹了TextReader和StreamReader的定義概念和一些注意事項,
C#--流與檔案(Stream & File)(一)
http://www.cnblogs.com/long-gengyun/archive/2010/03/28/1698681.html
流是位元組序列的抽象概念,如檔案的操作,輸入/輸出裝置,內部進行通訊的管道等,Stream類及其衍生類別提供這些不同類型的輸入和輸出的一般視圖,這樣的程式員就不必熟悉作業系統和基礎裝置的具體細節,也可以對流進行操作。
流常用的三個基本操作:
1. 讀取流:操作是從流到資料結構的資料轉送
2. 寫入流:該操作時從資料結構到流的資料轉送
3. 流支援尋找:尋找是對流內的當前位置進行查詢與修改
以上三個功能可以通過CanRead ,CanWrite,CanSeek屬性進行設定。
Read和Write方法支援讀寫各種不同格式的資料。對於支援尋找功能的流,可以使用Seek和SetLength方法以及Length和Position屬性查詢和修改流當前的位置和長度。
有些流實現執行資料的本地緩衝以提高效能。對於這樣的流,Flush方法可用於清除內部緩衝區並確保將所有資料寫入資料來源或儲存空間。
在實現Stream的衍生類別時,必須提供Read和Write方法的實現。非同步方法呼叫BeginRead,EndRead,BeginWrite和EndWrite通過同步方法Read和Write實現。ReadByte和WriteByte可以實現建立一個新的單元位元組數組,然後調用Read和Write實現。
檔案在操作時表現為流,即流是從一些輸入中讀取到的一系列位元組。
檔案按資訊在外部儲存空間上齶編碼方式可以分為文字檔和二進位檔案。
Stream類是System.IO命名空間中的一個類,在System.IO命名空間中,包含所有允許在資料流和檔案上進行同步和非同步讀取和寫入的類,下面簡單介紹一下常用的類。
1. Directory類:包含了所有操作目錄的靜態方法,如目錄的建立,移動,複製,刪除等
2. DirectoryInfo類:包含了所有操作目錄的執行個體方法,如目錄的各種屬性(名字,建立時間),目錄的各種操作(目錄的建立,是否存在,移動,刪除等)
3. File類:是對檔案的典型操作,提供文本的建立,開啟,複製,刪除,移動等靜態方法。也可以用於擷取檔案和設定檔案的基本資料。
4. FileInfo類:對檔案的典型操作, 提供文本的建立,開啟,複製,刪除,移動等執行個體方法。當檔案需要多次重用時,使用FileInfo類提供的執行個體方法,不可以使用File提供的靜態方法。
5. FileStream類:該類實現了對檔案讀取,寫入,開啟,關閉操作,支援隨機訪問檔案,可以使用同步方式開啟檔案進行讀寫,也可以用非同步方式開啟檔案進行讀寫。
6. Path類:該類對包含檔案或目錄路徑資訊的String執行個體操作,這些操作可以跨平台的方式執行的。
7. MemoryStream類:該類建立起支援儲存區為記憶體的流。
8. StreamReader類:該類可以讀取標準文字檔的內容。即實現一個TextReader。預設編碼格式為UTF-8。
9. StreamWriter類:該類可以往標準文字檔中寫入內容。即實現一個TextWriter。預設編碼格式為UTF-8。
10. StringReader類: 該類實現從字串進行讀取的TextReader。
11. StringWriter類:該類實現將資訊寫入字串,該資訊儲存在基礎的StringBuilder中。
12. TextReader類:該類表示可讀取連續字元系統的閱讀器。
13. TextWriter類:該類表示可以編寫一個有序字元系列的編輯器,是抽象類別。
C#:檔案、byte[]、Stream相互轉換
http://www.cnblogs.com/warioland/archive/2012/03/06/2381355.html
/// C# Stream 和 byte[] 之間的轉換/// 將 Stream 轉成 byte[] public byte[] StreamToBytes(Stream stream){ byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 設定當前流的位置為流的開始 stream.Seek(0, SeekOrigin.Begin); return bytes;} /// 將 byte[] 轉成 Stream public Stream BytesToStream(byte[] bytes){ Stream stream = new MemoryStream(bytes); return stream;}
///Stream 和 檔案之間的轉換///將 Stream 寫入檔案public void StreamToFile(Stream stream,string fileName){ // 把 Stream 轉換成 byte[] byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 設定當前流的位置為流的開始 stream.Seek(0, SeekOrigin.Begin); // 把 byte[] 寫入檔案 FileStream fs = new FileStream(fileName, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); bw.Write(bytes); bw.Close(); fs.Close();}
///從檔案讀取 Stream public Stream FileToStream(string fileName){ // 開啟檔案 FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); // 讀取檔案的 byte[] byte[] bytes = new byte[fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); fileStream.Close(); // 把 byte[] 轉換成 Stream Stream stream = new MemoryStream(bytes); return stream;}
FileStream讀寫檔案【StreamWriter 和 StreamReader】
http://www.cnblogs.com/yank/archive/2007/11/16/961878.html
c#Stream學習筆記