把握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
数组为要读写的长度。