45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:VB.NET中的流FileStream介绍

VB.NET中的流FileStream介绍

2016-08-29 10:21:17 来源:www.45fan.com 【

VB.NET中的流FileStream介绍

当你第一次用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以及StreamReaderStreamWriter类。 BinaryReader,用特定的编码将基元数据类型读作二进制值。BinaryWriter以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。StreamReader/Writer则是把数据存储为XML格式。在VB.NET里面采用那个区别不大,因为所用的类都应用于两种格式。

VB.NET支持传统的随机读写文件,你可以创建文件,用于存储Struct,然后根据记录数访问。就像在以前的Vb版本中一样,用FileOpenFileGet函数。很大程度上,这已经被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方法。

不需要指定任何参数。 OpenFileDialogOpenFile方法以只读方式打开文件; SaveFileDialogOpenFile方法以读写方式打开文件。

FileStream只支持最基本的操作,把数据写入字节数组或者从字节数组写入文件中。如果我们用FileStream把数据保存在文件中,首先把数据转化为Byte数组,然后调用FileStreamWrite方法。同样,FileStreamRead方法,返回的也是字节数组。你或许不会经常直接使用FileStream对象,我们还是有必要简单看一下它的基本功能

创建FileStream对象之后,调用WriteByte 写一个字节到文件中。 Write方法可以将一个数组写入文件中,需要三个参数

Write(buffer offset count)

Buffer是要写入数组地址,offset是偏移量,count指写入字节数量,Read的语法也一样。

由于FileStream要跟Bytes Array打交道,所以研究一下ASCIIEncoding GetBytesUnicodeEncoding 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数组为要读写的长度。

灵活多样的IO操作

有时候,在数据和字节数组之间转换是一件繁琐的事情。为了避免这些无聊的转换和简化代码,采用StreamReader/StreamWriteBinaryReader/BinaryWriter不愧为明智之举。StreamReader/StreamWrite分别由TextReader/TextWriter类派生,自动执行字节编码的转换。BinaryReader/BinaryWriterStream派生,主要以二进制的形式读写数据。

从二进制文件读数据的时候,首先创建一个BinaryReader的实例,BinaryReader的构建函数接受一个FileStream对象,代表将要读的文件。我们前面已经看过,可以用File.OpenRead 或者 File.OpenWrite 方法创建FileStream对象。

如下所示:

Dim BR As New IO.BinaryReader(IO.File.OpenRead(path))

Dim BW As New IO.BinaryWriter(IO.File.OpenWrite(path))

BinaryWriter类有WriteWriteLine两种方法,都可以接受任何类型的数据作为参数写入文件(WriteLine在文件尾追加一行数据)。BinaryReader类有很多读数据的方法,数据存储在文件上的时候,并没有任何关于自己类型的信息,所以读数据的时候,必须选择合适的重载Read方法。

下面的例子假设BW是一个已经初始化过的BinaryWriter对象,表示如何写一个字符串、整数、双精度数字到文件:

BW.WriteLine("A String")

BW.WriteLine(12345)

BW.WriteLine(123.456789999999)

读回数据的时候,必须选择BinaryReader合适的Read方法:

Dim s As String = BR.ReadString()

Dim i As Int32 = BR.ReadInt32()

Dim dbl As Double = BR.ReadDouble()

对于文本文件,采用StreamReader/StreamWriter对象。方法跟上面差不多,写数据同样用WriteWriteLine方法。Read方法读一个字符,ReadLine读一行数据(直到有回车/换行符为止),ReadToEnd读所有的字符,到文件结束。

对象序列化

到目前为止,我们只是把简单类型的数据写到文件中并读回程序。而实际上,大多数的程序读写的数据可能并不是简单类型,而是复杂的结构,例如:数组,数组列表,哈希表等。于是,我们采取一种成为序列化的技术,首先把数组的值转化为字节序列,然后写入文件,这样整个数组就存储下来。相反,我们称之为反序列化。

序列化是.NET的一个很大的话题,这列介绍一下基本的信息。

BinaryFormatterSerialize Deserialize方法把一个对象保存到文件和读回程序。首先,imports System.RunTime.Serialization.Formatters,免得写那么长的申明。Formatters名空间包含了BinaryFormatter类,用于以二进制的数据序列化对象。

创建BinaryFormatter实例,接着调用Serialize方法Serialize接受两个参数:一个是可写的FileStream实例,用于保存数据的文件;另外一个是对象本身:

Dim BinFormatter As New Binary.BinaryFormatter()

Dim R As New Rectangle(10, 20, 100, 200)

BinFormatter.Serialize(FS, R)

BinaryFormatterDeserialize方法只有一个


本文地址:http://www.45fan.com/dnjc/69205.html
Tags: 中的 把握 VB.NET
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部