关于StreamReader的知识分享
今天我们来简单的介绍一下StreamReader,在将StreamReader之前,我们先来了解一下他的父类:TextReader。对于TextReader,大家可能比较陌生,下面我们来看一下TextReader是什么。
一、TextReader
首先让我们来理解一下什么是TextReader,从字面意思入手的话,大家就会恍然大悟了,一个对于Text的读取器,可是又是怎么读取的呢?聪明的你肯定会想到,当然是通过连续的字符进行读取,为什么在介绍StreamReader之前要介绍这个呢?因为他们两个是父子关系,要了解StreamReader最好先了解他的父亲,下面,简单介绍一下TextReader
1、常用属性和方法:
我们可以想象一下Text这个词,在记事本上,中文、英文、各种代码,等等,都是Text,这些文本归根结底是通过一个个的char组成的,所以微软构造出了TextReader这个抽象类对于读取Text的一系列操作,同样对于TextReader我们无法直接实例化,因为他是一个抽象类,只有定义类的行为,不针对特定实现,那我们来看一下TextReader定义了哪些类的行为:
(1)具有一个protected类型的构造函数
(2)void Close() 方法:和上一篇Stream一样,TextReader也有Close方法,在用完之后,记得主动关闭它
(3)void Dispose()方法:释放所有该TextReader所只有的所有资源(注:加入TextReader中持有Stream或其他对象,当TextReader执行了Dispose方法时,Stream对象也被释放了)
(4)int Peek()方法:这个方法主要是寻找当前char的下一个char,当返回值是-1时,表示下个char已经时最后一个位置的char了。
(5)int Read()方法:同样,Read方法是读取下一个char,但是和Peek方法不同,Read方法使指针只想下个字符,但是Peek方法还是指向原来的那个字符
(6)int Read(char[] buffer,int index,int count)方法:这个重载Read方法和上一篇文章中Stream的Read方法有点神似,区别就是一个参数是byte数组,而这个是char数组,(注:是通过Reader将数据读入buffer数组),index从哪个位置开始,count读取char数量。
(7)int ReadBlock(char[] buffer,int index,int count)方法:和Read方法基本一致,区别是从效率上来说ReadBlock更高点,而且ReadBlock并非属于线程安全,使用时要注意。
(8)virtual string ReadLine()方法:顾名思义,这个方法将读取每一行数据并返回当前行的字符的字符串。
(9)virtual string ReadToEnd()方法:包含从当前位置到TextReader的接微的所有字符的字符串
下面,我们就写几个简单的示例来演示一下上面的几个属性和方法。
1 string text = "abc\nabc"; 2 3 4 using (TextReader reader = new StringReader(text)) 5 { 6 while (reader.Peek() != -1) 7 { 8 Console.WriteLine("Peek = {0}", (char)reader.Peek()); 9 Console.WriteLine("Read = {0}", (char)reader.Read()); 10 } 11 reader.Close(); 12 } 13 14 using (TextReader reader = new StringReader(text)) 15 { 16 char[] charBuffer = new char[3]; 17 int data = reader.ReadBlock(charBuffer, 0, 3); 18 for (int i = 0; i < charBuffer.Length; i++) 19 { 20 Console.WriteLine("通过readBlock读出的数据:{0}", charBuffer[i]); 21 } 22 reader.Close(); 23 } 24 25 using (TextReader reader = new StringReader(text)) 26 { 27 string lineData = reader.ReadLine(); 28 Console.WriteLine("第一行的数据为:{0}", lineData); 29 reader.Close(); 30 }