在学习字符数据流之前,看一个例子,在定义时不同的构造构造方法会出现不同的结果:
Imports System.IO Imports System.Text Public Class Form1 Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click Dim sr As New StreamReader("D:\11.txt") 'Dim sr As New StreamReader("D:\11.txt",Encoding.Default) TextBox1.Text = sr.ReadToEnd sr.Close() End Sub End Class
原因是编码的不同,最后显示的汉字有可能是乱码。这提醒我们在汉字的I/O时要注意编码。
.
正题 :字符数据流的结构:
TextReader与TextWriter类是抽象类,其基本方法与Stream类相似。
它们的主要区别在于:TextReader与TextWriter通过特定字符集编码方式转换成字节数据,完成字符数据的存取。
一、TextReader与TextWriter类
读写文本数据的基类是TextReader与TextWriter类。
这两个抽象类定义了从数据流或文本字符串中读写的基本功能,如Read、Peek等,与Stream类类似,差异是读取的是
字符串,而不是字节。
TextReader的方法有:Read、ReadLine、ReadToEnd
TextWriter的方法有:Writer、WriterLine
比如:
'===========TextReader========================= '读取文本读取器中的下一个字符并使该字符的位置提升一个字符 Public Overridable Function Read() As Integer '从当前读取器中读取指定数目的字符并从指定索引开始将该数据写入缓冲区 Public Overridable Function Read(<OutAttribute> buffer As Char(),index As Integer,count As Integer) As Integer '从文本读取器中读取一行字符并将数据作为字符串返回 Public Overridable Function ReadLine() As String '读取从当前位置到文本读取器末尾的所有字符并将它们作为一个字符串返回 Public Overridable Function ReadToEnd() As String '======TextWriter============================ '将字符写入该文本字符串或流。 Public Overridable Sub Write(value As Char) Public Overridable Sub Write(buffer As Char()) Public Overridable Sub Write(value As Integer) '将行结束符的字符串写入文本字符串或流 Public Overridable Sub WriteLine() Public Overridable Sub WriteLine(value As Char) '将后跟行结束符的字符子数组写入文本字符串或流 Public Overridable Sub WriteLine(buffer As Char(),count As Integer)
二、创建StreamReader对象
TextReader派生出StreamReader类,StreamReader从派生于Stream类的子类中读取数据。
StreamReader构造有根据基础流Stream来构造、根据文件名来构造:
'为指定的流初始化 StreamReader 类的新实例 Public Sub New(stream As Stream) '为指定的文件名初始化 StreamReader 类的新实例。 Public Sub New(path As String) '带编码方式的上面两类 Public Sub New(stream As Stream,encoding As Encoding) Public Sub New(path As String,encoding As Encoding)注意:StreamReader本身不能取得流的长度,只能由基类的流来取得(微软翻译为基础流):
StreamReader.BaseStream.Length
对于汉字情况,请选择Encoding.Default试试
三、StreamReader属性
BaseStream 返回基础流。
CurrentEncoding 获取当前 StreamReader 对象正在使用的当前字符编码。
EndOfStream 获取一个值,该值表示当前的流位置是否在流的末尾。(True/False)
四、StreamReader常用方法
读取文本文件中最常见的是: ReadLine、ReadToEnd、Peek、Read。
'返回下一个可用的字符,但不移动流位置(常用于探测下一字符或是否结束) Public Overrides Function Peek As Integer '读取输入流中的下一个字符并使该字符的位置提升一个字符。 Public Overrides Function Read As Integer '从当前流中将指定的最多个字符读到指定索引位置开始的缓冲区 Public Overrides Function Read (buffer As Char(),count As Integer ) As Integer Public Overrides Function ReadLine As String Public Overrides Function ReadToEnd As String
五、StreamWriter类
StreamWriter与StreamReader对应。创建对象时一样:由流或文件名来创建
1、构造:
StreamWriter(Stream)
用 UTF-8 编码及默认缓冲区大小,为指定的流初始化 StreamWriter 类的一个新实例。
StreamWriter(String)
用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例。
StreamWriter(Stream,Encoding)
用指定的编码及默认缓冲区大小,为指定的流初始化 StreamWriter 类的新实例。
StreamWriter(String,Boolean)
用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例。 如果该文件存在,
则可以将其覆盖或向其追加。 如果该文件不存在,则此构造函数将创建一个新文件。
2、写入方法:
主要有两个:Write、 WriterLine
还有一个隐形的Flush,清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流。
具体如:
Public Sub Writer(ByVal buffer() as Char)
Public Sub Writer(byVal buffer() as Char,ByVal index As Integer,Byval count As Integer)
Public Sub Writer(ByVal value As String)
六、StringReader与StringWriter
它是以字符串为数据源,前面的是以Stream为数据源。
所以构造方法是以字串:
Public Sub New(ByVal s As String)
Public Sub New (ByVal sb as StringBuilder)
同前面的StreamReader、StreamWriter一样,
StringReader的方法有:Peek、Read、ReadLine、ReadToEnd
StringWriter的方法有:Writer、WriterLine
唯一不同的,取是基础流的是用:GeStringBuilder 它返回数据源(前面是用BaseStream)
以一个例子结束吧:
Imports System.IO Public Class Form1 Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click Dim sr As New StreamReader("D:\11.txt") Dim e1() As String Dim e2() As String Do Until sr.EndOfStream If sr.ReadLine = "EA" Then Exit Do Loop e1 = Split(sr.ReadLine) e2 = Split(sr.ReadLine) For i As Int32 = 0 To UBound(e2) ListBox1.Items.Add(CInt(e2(i))) Next sr.Close() End Sub End Class