vb.net:把握VB.NET中的流(Stream) (三) Montaque(翻译)



把握VB.NET中流(Stream) ( 3)

文件操作具体例子

在这部分你将找到更多常用文件操作代码例子最常用、最基本操作就是把text写入文件和读回来现在应用通常不用 2进制文件作存储简单变量而用它来存储对象对象集合以及其他机器代码下面将看到具体操作例子

读写文本文件

为了把text保存到文件创建个基于FileStreamStreamReader对象然后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

同样采用类似语句我们读取个文本文件并把内容显示在TextBoxControl控件中StreamReaderReadToEnd思路方法返回文件全部内容

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以 2进制形式或者用SoapFormatter类以XML格式都可以序列化个具体对象只要把所有BinaryFormatter引用改为SoapFormatter无需改变任何代码就可以以XML格式序列化对象

首先创建个BinaryFormatter例子:

Dim BinFormatter As New Binary.BinaryFormatter

然后创建个用于存储序列化对象FileStream对象:

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

接着BinFormatterSerialize思路方法序列化任何可以序列化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对象例子然后BinFormatterSerialize思路方法序列化自定义对象:

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 .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 .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 .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
Tags:  vb.net源码 vb.net语法 vb.net教程 vb.net

延伸阅读

最新评论

发表评论