2010年12月23日 星期四

把握VB.NET中的流 Stream (1)

來源
--
把握VB.NET中的流(Stream) (一)

當你第一次用VB.NET讀寫文件的時候,你肯定會發現VB.NET摒棄了傳統的文件I/O支持,感覺不習慣。其實,在.NET裡面,微軟用豐富的「流」對像取代了傳統的文件操作,而「流」,是一個在Unix裡面經常使用的對象。
我們可以把流當作一個通道,程序的的數據可以沿著這個通道」流」到各種數據存儲機構(比如:文件,字符串,數組,或者其他形式的流等)。為什麼我們會摒棄用了那麼久的IO操作,而代之為流呢?其中很重要的一個原因就是並不是所有的數據都存在於文件中。現在的程序,從各種類型的數據存儲中獲取數據,比如可以是一個文件,內存中的緩衝區,還有InterneT。而流技術使得應用程序能夠基於一個編程模型,獲取各種數據,而不必要學會怎麼樣去獲取遠程web服務器上的一個文件的具體技術。我們只需要在應用程序和web服務器之間創建一個流,然後讀取服務器發送的數據就可以了。
流對象,封裝了讀寫數據源的各種操作,最大的優點就是一當你學好怎麼樣操作某一個數據源時,你就可以把這種技術擴展到其他形形色色的數據源。
流的種類
流是一個抽像類,你不能在程序中申明Stream的一個實例。在.NET裡面,由Stream派生出5種具體的流,分別是:
FileStream 支持對文件的順序和隨機讀寫操作
MemoryStream 支持對內存緩衝區的順序和隨機讀寫操作
NETworkStream 支持對Internet網絡資源的順序和隨機讀寫操作,存在於System.Net.Sockets名稱空間
CryptoStream 支持數據的編碼和解碼,存在於System.Security.Cryptography 名稱空間
BufferedStream 支持緩衝式的讀寫對那些本身不支持的對象
並不是所有的Stream都採用用完全一摸一樣的方法,比如讀取本地文件的流,可以告訴我們文件的長度,當前讀寫的位置等,你可以用Seek方法跳到文件的任意位置。相反,讀取遠程文件的流不支持這些特性。不過,Stream本身有CanSeek, CanRead 和 CanWrite屬性,用於區別數據源,告訴我們支持還是不支持某中特性。
下面我們簡單介紹一個FileStream類
FileStream類
進行本地文件操作的時候,我們可以採用FileSteam類, 可以很簡單的讀寫為字節數組(arrays of bytes)。對於簡單數據類型的數據的讀寫,可以採用BinaryReader 和BinaryWriter以及StreamReader,StreamWriter類。 BinaryReader,用特定的編碼將基元數據類型讀作二進制值。BinaryWriter以二進制形式將基元類型寫入流,並支持用特定的編碼寫入字符串。StreamReader/Writer則是把數據存儲為XML格式。在VB.NET裡面採用那個區別不大,因為所用的類都應用於兩種格式。
VB.NET支持傳統的隨機讀寫文件,你可以創建文件,用於存儲Struct,然後根據記錄數訪問。就像在以前的Vb版本中一樣,用FileOpen,FileGet函數。很大程度上,這已經被XML或者數據庫取代。如果你創建新的應用程序,而有不需要考慮跟就版本的兼容問題,建議採用.NET的新特性。
不管你將要使用拿一個StreamClass,你都必須創建一個FileStream對象。有很多方式創建,最簡單就是指定文件路徑,打開模式,如下面的語法。
Dim fStream As New FileStream(path, fileMode, fileAccess)
Path要包含文件的路徑以及文件名。fileMode是枚舉類型FileMode的成員之一,如下表所示。fileAccess是枚舉類型FileAccess的成員。Read (只讀), ReadWrite (讀寫), and Write (寫操作)。決定了文件的讀寫權限。
成員名稱
說明
Append
打開現有文件並查找到文件尾,或創建新文件。
Create
指定操作系統應創建新文件。如果文件已存在,它將被改寫。
CreateNew
指定操作系統應創建新文件。
Open
指定操作系統應打開現有文件。
OpenOrCreate
指定操作系統應打開文件(如果文件存在);否則,應創建新文件。
Truncate
指定操作系統應打開現有文件。文件一旦打開,就將被截斷為為零字節大小。
當然,你也可以用 (Open, OpenRead, OpenText, OpenWrite)創建FileStream
Dim FS As New FileStream = IO.File.OpenWrite("c:\Stream.txt")
另外一種方式打開文件可以用OpenFileDialog 和 SaveFileDialog控件的OpenFile方法。
不需要指定任何參數。 OpenFileDialog的OpenFile方法以只讀方式打開文件; SaveFileDialog的OpenFile方法以讀寫方式打開文件。
FileStream只支持最基本的操作,把數據寫入字節數組或者從字節數組寫入文件中。如果我們用FileStream把數據保存在文件中,首先把數據轉化為Byte數組,然後調用FileStream的Write方法。同樣,FileStream的Read方法,返回的也是字節數組。你或許不會經常直接使用FileStream對象,我們還是有必要簡單看一下它的基本功能
創建FileStream對像之後,調用WriteByte 寫一個字節到文件中。 Write方法可以將一個數組寫入文件中,需要三個參數
Write(buffer, offset, count)
Buffer是要寫入數組地址,offset是偏移量,count指寫入字節數量,Read的語法也一樣。
由於FileStream要跟Bytes Array打交道,所以研究一下ASCIIEncoding 的GetBytes和UnicodeEncoding 的GetChars很有必要
下面的例子是一個轉換操作。
Dim buffer() As Byte
Dim encoder As New System.Text.ASCIIEncoding()
Dim str As String = "This is a line of text"
ReDim buffer(str.Length - 1)
Encoder.GetBytes(str, 0, str.Length, buffer, 0)
FS.Write(buffer, 0, buffer.Length)
注意:必須Resize要寫入的Byte數組為要讀寫的長度。

沒有留言:

張貼留言