把握VB.NET中的流(Stream) (3) Montaque(翻譯)
發(fā)表時間:2023-08-13 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]把握VB.NET中的流(Stream) (三)文件操作具體實例在這一部分,你將找到更多常用的文件操作的代碼實例。最常用、最基本的操作就是把text寫入文件和讀回來,F(xiàn)在的應(yīng)用程序通常不用二進(jìn)制文件作...
把握VB.NET中的流(Stream) (三)
文件操作具體實例
在這一部分,你將找到更多常用的文件操作的代碼實例。最常用、最基本的操作就是把text寫入文件和讀回來,F(xiàn)在的應(yīng)用程序通常不用二進(jìn)制文件作存儲簡單的變量,而用它來存儲對象,對象集合以及其他機(jī)器代碼。下面,將看到具體操作的例子。
讀寫文本文件
為了把text保存到文件,創(chuàng)建一個基于FileStream的StreamReader對象,然后調(diào)用Write方法把需要保存的text寫入文件。下面的代碼用SaveFileDialog提示用戶指定一個文件,用于保存TextBox1的內(nèi)容。
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
同樣采用類似的語句,我們讀取一個文本文件,并把內(nèi)容顯示在TextBox控件中。StreamReader的ReadToEnd方法返回文件的全部內(nèi)容。
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以二進(jìn)制的形式,或者用SoapFormatter類以XML格式都可以序列化一個具體的對象。只要把所有BinaryFormatter的引用改為SoapFormatter,無需改變?nèi)魏未a,就可以以XML格式序列化對象。
首先創(chuàng)建一個BinaryFormatter實例:
Dim BinFormatter As New Binary.BinaryFormatter()
然后創(chuàng)建一個用于存儲序列化對象的FileStream對象:
Dim FS As New System.IO.FileStream("c:\test.txt", IO.FileMode.Create)
接著調(diào)用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
下面代碼創(chuàng)建一個Person對象實例,然后調(diào)用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))
創(chuàng)建一個BinaryFormatter對象,調(diào)用其Deserialize方法,然后把返回的值轉(zhuǎn)化為正確的類型,就是整個反序列化過程。然后接著發(fā)序列化Stream的其他對象。
假定已經(jīng)序列化了Person和Rectangle兩個對象,以同樣的順序,我們反序列化就可以得到原來的對象:
Dim P As New Person()
P = BinFormatter.Serialize(FS, Person)
Dim R As New Rectangle
R = BinFormatter.Serialize(FS, Rectangle)
Persisting Collections
集合的存儲
大多數(shù)程序處理對象集合而不是單個的對象。對于集合數(shù)據(jù),首先創(chuàng)建一個數(shù)組(或者是其他類型的集合,比如ArrayList或HashTable),用對象填充,然后一個Serialize方法就可以序列化真?zhèn)集合,是不是很簡單?下面的例子,首先創(chuàng)建一個有兩個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)
以存儲序列化數(shù)據(jù)的文件為參數(shù),調(diào)用一個BinaryFormatter實例的Deserialize方法,就會返回一個對象,然后把它轉(zhuǎn)化為合適的類型。下面的代碼反序列化文件中的所有對象,然后處理所有的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()
下面的例子調(diào)用Deserialize方法反序列化真?zhèn)集合,然后把返回值轉(zhuǎn)換為合適的類型(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()