把握VB.NET中的流(Stream)
2024-07-10 13:07:14
供稿:網友
 
當你第一次用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數組為要讀寫的長度。