明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

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

[摘要]把握VB.NET中的流(Stream) (一)當(dāng)你第一次用VB.NET讀寫文件的時(shí)候,你肯定會(huì)發(fā)現(xiàn)VB.NET摒棄了傳統(tǒng)的文件I/O支持,感覺不習(xí)慣。其實(shí),在.NET里面,微軟用豐富的“流”對(duì)象取代...
把握VB.NET中的流(Stream) (一)

當(dāng)你第一次用VB.NET讀寫文件的時(shí)候,你肯定會(huì)發(fā)現(xiàn)VB.NET摒棄了傳統(tǒng)的文件I/O支持,感覺不習(xí)慣。其實(shí),在.NET里面,微軟用豐富的“流”對(duì)象取代了傳統(tǒng)的文件操作,而“流”,是一個(gè)在Unix里面經(jīng)常使用的對(duì)象。
我們可以把流當(dāng)作一個(gè)通道,程序的的數(shù)據(jù)可以沿著這個(gè)通道”流”到各種數(shù)據(jù)存儲(chǔ)機(jī)構(gòu)(比如:文件,字符串,數(shù)組,或者其他形式的流等)。為什么我們會(huì)摒棄用了那么久的IO操作,而代之為流呢?其中很重要的一個(gè)原因就是并不是所有的數(shù)據(jù)都存在于文件中,F(xiàn)在的程序,從各種類型的數(shù)據(jù)存儲(chǔ)中獲取數(shù)據(jù),比如可以是一個(gè)文件,內(nèi)存中的緩沖區(qū),還有InterneT。而流技術(shù)使得應(yīng)用程序能夠基于一個(gè)編程模型,獲取各種數(shù)據(jù),而不必要學(xué)會(huì)怎么樣去獲取遠(yuǎn)程web服務(wù)器上的一個(gè)文件的具體技術(shù)。我們只需要在應(yīng)用程序和web服務(wù)器之間創(chuàng)建一個(gè)流,然后讀取服務(wù)器發(fā)送的數(shù)據(jù)就可以了。
流對(duì)象,封裝了讀寫數(shù)據(jù)源的各種操作,最大的優(yōu)點(diǎn)就是一當(dāng)你學(xué)好怎么樣操作某一個(gè)數(shù)據(jù)源時(shí),你就可以把這種技術(shù)擴(kuò)展到其他形形色色的數(shù)據(jù)源。
流的種類
流是一個(gè)抽象類,你不能在程序中申明Stream的一個(gè)實(shí)例。在.NET里面,由Stream派生出5種具體的流,分別是:
FileStream 支持對(duì)文件的順序和隨機(jī)讀寫操作
MemoryStream 支持對(duì)內(nèi)存緩沖區(qū)的順序和隨機(jī)讀寫操作
NETworkStream 支持對(duì)Internet網(wǎng)絡(luò)資源的順序和隨機(jī)讀寫操作,存在于System.Net.Sockets名稱空間
CryptoStream 支持?jǐn)?shù)據(jù)的編碼和解碼,存在于System.Security.Cryptography 名稱空間
BufferedStream 支持緩沖式的讀寫對(duì)那些本身不支持的對(duì)象
并不是所有的Stream都采用用完全一摸一樣的方法,比如讀取本地文件的流,可以告訴我們文件的長(zhǎng)度,當(dāng)前讀寫的位置等,你可以用Seek方法跳到文件的任意位置。相反,讀取遠(yuǎn)程文件的流不支持這些特性。不過,Stream本身有CanSeek, CanRead 和 CanWrite屬性,用于區(qū)別數(shù)據(jù)源,告訴我們支持還是不支持某中特性。
下面我們簡(jiǎn)單介紹一個(gè)FileStream類
FileStream類
進(jìn)行本地文件操作的時(shí)候,我們可以采用FileSteam類, 可以很簡(jiǎn)單的讀寫為字節(jié)數(shù)組(arrays of bytes)。對(duì)于簡(jiǎn)單數(shù)據(jù)類型的數(shù)據(jù)的讀寫,可以采用BinaryReader 和BinaryWriter以及StreamReader,StreamWriter類。 BinaryReader,用特定的編碼將基元數(shù)據(jù)類型讀作二進(jìn)制值。BinaryWriter以二進(jìn)制形式將基元類型寫入流,并支持用特定的編碼寫入字符串。StreamReader/Writer則是把數(shù)據(jù)存儲(chǔ)為XML格式。在VB.NET里面采用那個(gè)區(qū)別不大,因?yàn)樗玫念惗紤?yīng)用于兩種格式。
VB.NET支持傳統(tǒng)的隨機(jī)讀寫文件,你可以創(chuàng)建文件,用于存儲(chǔ)Struct,然后根據(jù)記錄數(shù)訪問。就像在以前的Vb版本中一樣,用FileOpen,F(xiàn)ileGet函數(shù)。很大程度上,這已經(jīng)被XML或者數(shù)據(jù)庫取代。如果你創(chuàng)建新的應(yīng)用程序,而有不需要考慮跟就版本的兼容問題,建議采用.NET的新特性。
不管你將要使用拿一個(gè)StreamClass,你都必須創(chuàng)建一個(gè)FileStream對(duì)象。有很多方式創(chuàng)建,最簡(jiǎn)單就是指定文件路徑,打開模式,如下面的語法。
Dim fStream As New FileStream(path, fileMode, fileAccess)
Path要包含文件的路徑以及文件名。fileMode是枚舉類型FileMode的成員之一,如下表所示。fileAccess是枚舉類型FileAccess的成員。Read (只讀), ReadWrite (讀寫), and Write (寫操作)。決定了文件的讀寫權(quán)限。
成員名稱
說明
Append
打開現(xiàn)有文件并查找到文件尾,或創(chuàng)建新文件。
Create
指定操作系統(tǒng)應(yīng)創(chuàng)建新文件。如果文件已存在,它將被改寫。
CreateNew
指定操作系統(tǒng)應(yīng)創(chuàng)建新文件。
Open
指定操作系統(tǒng)應(yīng)打開現(xiàn)有文件。
OpenOrCreate
指定操作系統(tǒng)應(yīng)打開文件(如果文件存在);否則,應(yīng)創(chuàng)建新文件。
Truncate
指定操作系統(tǒng)應(yīng)打開現(xiàn)有文件。文件一旦打開,就將被截?cái)酁闉榱阕止?jié)大小。
當(dāng)然,你也可以用 (Open, OpenRead, OpenText, OpenWrite)創(chuàng)建FileStream
Dim FS As New FileStream = IO.File.OpenWrite("c:\Stream.txt")
另外一種方式打開文件可以用OpenFileDialog 和 SaveFileDialog控件的OpenFile方法。
不需要指定任何參數(shù)。 OpenFileDialog的OpenFile方法以只讀方式打開文件; SaveFileDialog的OpenFile方法以讀寫方式打開文件。
FileStream只支持最基本的操作,把數(shù)據(jù)寫入字節(jié)數(shù)組或者從字節(jié)數(shù)組寫入文件中。如果我們用FileStream把數(shù)據(jù)保存在文件中,首先把數(shù)據(jù)轉(zhuǎn)化為Byte數(shù)組,然后調(diào)用FileStream的Write方法。同樣,F(xiàn)ileStream的Read方法,返回的也是字節(jié)數(shù)組。你或許不會(huì)經(jīng)常直接使用FileStream對(duì)象,我們還是有必要簡(jiǎn)單看一下它的基本功能
創(chuàng)建FileStream對(duì)象之后,調(diào)用WriteByte 寫一個(gè)字節(jié)到文件中。 Write方法可以將一個(gè)數(shù)組寫入文件中,需要三個(gè)參數(shù)
Write(buffer, offset, count)
Buffer是要寫入數(shù)組地址,offset是偏移量,count指寫入字節(jié)數(shù)量,Read的語法也一樣。
由于FileStream要跟Bytes Array打交道,所以研究一下ASCIIEncoding 的GetBytes和UnicodeEncoding 的GetChars很有必要
下面的例子是一個(gè)轉(zhuǎn)換操作。
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數(shù)組為要讀寫的長(zhǎng)度!