當前位置:開發者網絡 >> 技術教程 >> .NET教程 >> 文件IO >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
把握VB.NET中的流(Stream) (三) Montaque(翻譯)
作者:未知
日期:2003-07-12
人氣:
投稿:Andy.m(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:
把握VB.NET中的流(Stream) (三)

文件操作具體實例

在這一部分,你將找到更多常用的文件操作的代碼實例。最常用、最基本的操作就是把text寫入文件和讀回來。現在的應用程序通常不用二進制文件作存儲簡單的變量,而用它來存儲對象,對像集合以及其他機器代碼。下面,將看到具體操作的例子。

讀寫文本文件

為了把text保存到文件,創建一個基於FileStream的StreamReader對象,然後調用Write方法把需要保存的text寫入文件。下面的代碼用SaveFileDialog提示用戶指定一個文件,用於保存TextBox1的內容。

   SaveFileDialog1.Filter = _

      "Text Files|*.txt|All Files|*.*"

   SaveFileDialog1.FilterIndex = 0

   If SaveFileDialog1.ShowDialog = DialogResult.OK Then

       Dim FS As FileStream = SaveFileDialog1.OpenFile

       Dim SW As New StreamWriter(FS)

       SW.Write(TextBox1.Text)

       SW.Close()

       FS.Close()

   End If

同樣採用類似的語句,我們讀取一個文本文件,並把內容顯示在TextBox控件中。StreamReader的ReadToEnd方法返回文件的全部內容。

   OpenFileDialog1.Filter = _

      "Text Files|*.txt|All Files|*.*"

   OpenFileDialog1.FilterIndex = 0

   If OpenFileDialog1.ShowDialog = DialogResult.OK Then

       Dim FS As FileStream

       FS = OpenFileDialog1.OpenFile

       Dim SR As New StreamReader(FS)

       TextBox1.Text = SR.ReadToEnd

       SR.Close()

       FS.Close()

   End If

各種對象的存儲

採用BinaryFormatte以二進制的形式,或者用SoapFormatter類以XML格式都可以序列化一個具體的對象。只要把所有BinaryFormatter的引用改為SoapFormatter,無需改變任何代碼,就可以以XML格式序列化對象。

首先創建一個BinaryFormatter實例:

   Dim BinFormatter As New Binary.BinaryFormatter()

然後創建一個用於存儲序列化對象的FileStream對像:

   Dim FS As New System.IO.FileStream("c:\test.txt", IO.FileMode.Create)

接著調用BinFormatter的Serialize方法序列化任何可以序列化的framework對像:

   R = New Rectangle(rnd.Next(0, 100),rnd.Next(0, 300), _

         rnd.Next(10, 40),rnd.Next(1, 9))

   BinFormatter.Serialize(FS, R)

加一個Serializable屬性使得自定義的對象可以序列化

    <Serializable()> Public Structure Person

       Dim Name As String

       Dim Age As Integer

       Dim Income As Decimal

   End Structure

下面代碼創建一個Person對像實例,然後調用BinFormatter的Serialize方法序列化自定義對像:

   P = New Person()

   P.Name = "Joe Doe"

   P.Age = 35

   P.Income = 28500

   BinFormatter.Serialize(FS, P)

你也可以在同一個Stream中接著序列化其他對象,然後以同樣的順序讀回。例如,在序列化Person對像之後接著序列化一個Rectangle對像:

   BinFormatter.Serialize(FS, New Rectangle(0, 0, 100, 200))

     創建一個BinaryFormatter對象,調用其Deserialize方法,然後把返回的值轉化為正確的類型,就是整個反序列化過程。然後接著發序列化Stream的其他對象。

假定已經序列化了Person和Rectangle兩個對象,以同樣的順序,我們反序列化就可以得到原來的對象:

   Dim P As New Person()

   P = BinFormatter.Serialize(FS, Person)

   Dim R As New Rectangle

   R = BinFormatter.Serialize(FS, Rectangle)

Persisting Collections

集合的存儲

大多數程序處理對像集合而不是單個的對象。對於集合數據,首先創建一個數組(或者是其他類型的集合,比如ArrayList或HashTable),用對像填充,然後一個Serialize方法就可以序列化真個集合,是不是很簡單?下面的例子,首先創建一個有兩個Person對象的ArrayList,然後序列化本身:

   Dim FS As New System.IO.FileStream _

      ("c:\test.txt", IO.FileMode.Create)

   Dim BinFormatter As New Binary.BinaryFormatter()

   Dim P As New Person()

   Dim Persons As New ArrayList

   P = New Person()

   P.Name = "Person 1"

   P.Age = 35

   P.Income = 32000

   Persons.Add(P)

   P = New Person()

   P.Name = "Person 2"

   P.Age = 50

   P.Income = 72000

   Persons.Add(P)

   BinFormatter.Serialize(FS, Persons)

以存儲序列化數據的文件為參數,調用一個BinaryFormatter實例的Deserialize方法,就會返回一個對象,然後把它轉化為合適的類型。下面的代碼反序列化文件中的所有對象,然後處理所有的Person對像:

   FS = New System.IO.FileStream _

      ("c:\test.txt", IO.FileMode.OpenOrCreate)

   Dim obj As Object

   Dim P As Person(), R As Rectangle()

   Do

       obj = BinFormatter.Deserialize(FS)

       If obj.GetType Is GetType(Person) Then

           P = CType(obj, Person)

           ' Process the P objext

       End If

   Loop While FS.Position < FS.Length - 1

   FS.Close()

下面的例子調用Deserialize方法反序列化真個集合,然後把返回值轉換為合適的類型(Person):

   FS = New System.IO.FileStream("c:\test.txt", IO.FileMode.OpenOrCreate)

   Dim obj As Object

   Dim Persons As New ArrayList

   obj = CType(BinFormatter.Deserialize(FS), ArrayList)

   FS.Close()

相關文章: