把握VB.NET中的流(Stream) (一) - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- 把握VB.NET中的流(Stream) (一) (http://www.webasp.net/article/4/3976.htm) |
| -- 作者:未知 -- 發佈日期: 2003-07-12 |
| 把握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數組為要讀寫的長度。 |
| webasp.net |