前面的FileStream、BufferedStream、MemoryStream类都是派生于Stream类。
二进制数据流不同,它并不派生于Stream,而是直接派生于System.Object类。
因此,天生不足,它只有串接到Stream类或派生类中进行操作,即二进制数据流的构造都要用Stream类。
二进制数据流有两个类:BinaryReader和BinaryWriter
它们有针对特定数据类型的专门读取方法。
一、BinaryReader类
1、创建BinaryReader对象。
BinaryReader本身不能创建对象,必须串接到Stream类型的数据流对象,才能进行创建读取相关操作。
'基于所指定的流和特定的 UTF-8 编码,初始化 BinaryReader 类的新实例 Public Sub New(input As Stream) '基于所指定的流和特定的字符编码,初始化 BinaryReader 类的新实例 Public Sub New(input As Stream,encoding As Encoding)
参数Stream指明的流的属性不能与BinaryReader冲突,比如此时是读,则流中应有读的特性。
2、Read读取二进制数值
每读一次,自动移动位置。
'字符为单位,返回下一位读取的字符,位置下移一位。若是末尾返回-1 Public Overridable Function Read() As Integer '以字节为单位读取,index缓冲区buffer的起始点,count长度。返回值:读取的个数 Public Overridable Function Read(buffer As Byte(),index As Integer,count As Integer) As Integer '以字符为单位读取, Public Overridable Function Read(buffer As Char(),count As Integer) As Integer
读取例子:
Imports System.IO Public Class Form1 Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click Dim fs As New FileStream("D:\11.txt",FileMode.Open,FileAccess.Read,FileShare.Read) Dim br As New IO.BinaryReader(fs) TextBox1.Text = br.Read() '字符1,返回的是49(ASC码) TextBox1.Text &= Chr(br.Read()) '字符2,返回的是50(ASC码),这里chr将ASC转为字符 br.Close() fs.Close() End Sub End Class
3、读取指定数据类型
(1)读取字节
'从当前流中读取下一个字节,并使流的当前位置提升 1 个字节 Public Overridable Function ReadByte() As Byte '从当前流中读取指定的字节数以写入字节数组中,并将当前位置前移相应的字节数 Public Overridable Function ReadBytes(count As Integer) As Byte()注意:如果数据位于数据流末尾将发生异常(下同)
(2)读取整形:Short、Integer、Long
读取的本质都会转为.net framework的类型即:int16、int32、int64。因为他们占的字节分别是2,4,8
'从当前流中读取 2 字节有符号整数,并使流的当前位置提升 2 个字节 Public Overridable Function ReadInt16 As Short '从当前流中读取 4 字节有符号整数,并使流的当前位置提升 4 个字节。 Public Overridable Function ReadInt32 As Integer '从当前流中读取 8 字节有符号整数,并使流的当前位置向前移动 8 个字节。 Public Overridable Function ReadInt64 As Long
咋一看,怎么不一样,把它转化成16进制看一下34 33 32 31 实际上就是字符4 3 2 1 的ASC码。
注意:在读取对应数量字节时,若数据长度不足(如到了文件末),将发生错误。比如,离文件末还有2个字节时,读取为int32(4字节)将出错。
(3)读取浮点型Decimal、Double、Single
'从当前流中读取十进制数值,并将该流的当前位置提升十六个字节。 Public Overridable Function ReadDecimal As Decimal '从当前流中读取 8 字节浮点值,并使流的当前位置提升 8 个字节 Public Overridable Function ReadDouble As Double '从当前流中读取 4 字节浮点值,并使流的当前位置提升 4 个字节。 Public Overridable Function ReadSingle As Single
(4)读取字符型Char、String
Char是2个字节的单一Unicode,字符数值范围0--255;
String是一个以上Unicode字符组成的连续字符串。
'从当前流中读取下一个字符,并根据所使用的 Encoding 和从流中读取的特定字符,提升流的当前位置。 Public Overridable Function ReadChar As Char '从当前流中读取指定的字符数,并以字符数组的形式返回数据,然后根据所使用的 Encoding 和从流中读取的特定字符,将当前位置前移。 Public Overridable Function ReadChars(count As Integer) As Char() '从当前流中读取一个字符串。 字符串有长度前缀,一次 7 位地被编码为整数。 Public Overridable Function ReadString As String
(5)特殊的预读:PeekChar
前面的读取,都会向前移动对应的位置,但有时只想查看前面字符,而又不想移动当前文件流的位置。
可以用PeekChar
‘返回下一个可用的字符,并且不提升字节或字符的位置
Public Overridable Function PeekChar As Integer
二、BinaryWriter类
与BinaryReader类似,也须串接到数据流上。
1、创建对象:
Public Sub New(ByVal output As Stream)
2、写入
支持各种类型,同BinaryReader一样:
'各种数据类型 Public Overridable Sub Write (value As Boolean ) Public Overridable Sub Write (value As Byte ) Public Overridable Sub Write (ch As Char ) Public Overridable Sub Write (chars As Char() ) Public Overridable Sub Write (value As Decimal) '........... '字节数组 Public Overridable Sub Write ( _ buffer As Byte(),_ index As Integer,_ count As Integer _ ) '字符数组 Public Overridable Sub Write ( _ chars As Char(),_ count As Integer _ )