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

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

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

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

不需要指定任何参数。 OpenFileDialog 的 OpenFile 方法以只读方式打开文件 ; SaveFileDialog 的 OpenFile 方法以读写方式打开文件。

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

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

Write(buffer , offset , count)

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

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

Published At
Categories with Web编程
Tagged with
comments powered by Disqus