只有 定义类的行为

时间:2021-09-21 06:00:40

TextReader 和StreamReader

目录:

为什么要介绍 TextReader?

首先让我们来理解下什么是TextReader,从字面上的意思入手的话,大家就会恍然大悟了

一个对付Text的读取器,可是又是怎么读取的呢?聪明的你必定会想到,固然是通过持续

的字符进行读取, 为什么在介绍StreamReader之前,要搞这个东东? 答案其实很简单:他们

两个就是父子关系,要了解StreamReader最好先了解他的父亲,请允许我对他们进行下简单介绍: 

TextReader的常用属性和要领:

我们闭上眼可以想象一下 Text这个词的范畴,它囊括了许多的文件类型,我们可以在记事本上

使用任何语言(英语,中文,c# ,天书,javascript,jquery,xml,xaml,sql,c++……),如此多

的语言文本归根结底还是通过一个个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 的结尾的所有字符的字符串 

下面的例子将是对上述要领的温故而知新:

string text = "abc\nabc";


using (TextReader reader = new StringReader(text))
{
while (reader.Peek() != -1)
{
Console.WriteLine("Peek = {0}", (char)reader.Peek());
Console.WriteLine("Read = {0}", (char)reader.Read());
}
reader.Close();
}

using (TextReader reader = new StringReader(text))
{
char[] charBuffer = new char[3];
int data = reader.ReadBlock(charBuffer, 0, 3);
for (int i = 0; i < charBuffer.Length; i++)
{
Console.WriteLine("通过readBlock读出的数据:{0}", charBuffer[i]);
}
reader.Close();
}

using (TextReader reader = new StringReader(text))
{
string lineData = reader.ReadLine();
Console.WriteLine("第一行的数据为:{0}", lineData);
reader.Close();
}

using (TextReader reader = new StringReader(text))
{
string allData = reader.ReadToEnd();
Console.WriteLine("全部的数据为:{0}", allData);
reader.Close();
}

Console.ReadLine();

输出功效:

只有 定义类的行为

StreamReader登场

终于今天的主角登场了,在前面做了那么多铺垫后在学习它会事半功倍

从StreamReader想到多态

在说明StreamReader之前还有一件事要提起,那就是多态, 多态到底是什么观点呢?聪明的你必定会想到多态不就是子类的多种

表示形式?不错,但这还是不是完全的,不只如此,现实世界中,父亲帮儿子买了套屋子,但是他没有在房产证上写儿子的名字,

所以这个屋子儿子和父亲能配合使用,儿子能按照本身的喜好装修屋子,父亲也能住在儿子装修好的屋子内,也就是说父类能够

灵活使用子类的成果,更科学的一点就是子类的指针允许(赋值给)父类指针。上述例子中

TextReader reader = new StringReader(text)

这个就是个多态的经典例子大家不妨事深刻理解下这个重要的观点

简单介绍下Encoding编码

为什么要简单介绍Encoding编码?因为Encoding编码在Stream和相关类中起的非常重要的感化,

由于Encoding类会在后续章节详细解释,,此刻我就先介绍下 Encoding类一些重要编码  

只有 定义类的行为

以上等于Encoding类中一些特定的编码,大家先了解即可,但使用Default时有点必需注意,如果你用不一样编码的机器的时候,

注意处事器或者其他操纵系统的编码法则,举个例子,如果你在一其中文操纵系统进行编码,但是颁布到了一个其他语言的操纵

系统上那就会出问题了这时候你必需选择一个通用编码

StreamReader 类的界说和感化

StreamReader 的界说:实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。

在对付流的操纵中,StreamReader对付流的读取方面非常重要,为什么这么说呢,我们常用的文件的复制,移动,上传,下载,压缩,生存,

长途FTP文件的读取,甚至于HttpResponse等等只要是于流相关的任何派生类StreamReader 都能够轻松措置惩罚惩罚,固然,大家甚至可以自界说

相关的派生类去实现庞大的序列化。在实际项目,我们可能碰到过许多上述的情况,有时乱码的问题会让我们发狂,但是只要深刻去理解根本的话,

我相信大家都能找到适合本身的解决要领

StreamReader 类的常用属性及要领

其实StreamReader的一些要领已经在其父类TextReader中说的很仔细了,但是小我私家感受结构函数和属性才是重点.

首先上结构函数

*1: StreamReader(Stream stream)

将stream作为一个参数 放入StreamReader,这样的话StreamReader可以对该stream进行读取操纵,Stream东西可以非常广泛,包孕所有Stream的派生类东西

*2: StreamReader(string string, Encoding encoding)

 这里的string东西不是简单的字符串而是具体文件的地点,然后按照用户选择编码去读取流中的数据

*3: StreamReader(string string,bool detectEncodingFromByteOrderMarks)