ibcadmin 发表于 2019-10-24 09:50:45

关于StreamReader的知识分享

<p>本日我们来简单的介绍一下StreamReader,在将StreamReader之前,我们先来了解一下他的父类:TextReader。对于TextReader,大家可能比较生疏,下面我们来看一下TextReader是什么。</p>
<p><strong>一、TextReader</strong></p>
<p>起首让我们来明白一下什么是TextReader,从字面意思入手的话,大家就会名顿开了,一个对于Text的读取器,但是又是怎么读取的呢?聪明的你肯定会想到,当然是通过连续的字符进行读取,为什么在介绍StreamReader之前要介绍这个呢?由于他们两个是父子关系,要了解StreamReader最好先了解他的父亲,下面,简单介绍一下TextReader</p>
<p><strong>1、常用属性和方法:</strong></p>
<p>我们可以想象一下Text这个词,在记事本上,中文、英文、各种代码,等等,都是Text,这些文本归根结底是通过一个个的char组成的,所以微软构造出了TextReader这个抽象类对于读取Text的一系列操作,同样对于TextReader我们无法直接实例化,由于他是一个抽象类,只有定义类的举动,不针对特定实现,那我们来看一下TextReader定义了哪些类的举动:</p>
<p><strong>(1)</strong>具有一个protected范例的构造函数</p>
<p><strong>(2)void Close() 方法:</strong>和上一篇Stream一样,TextReader也有Close方法,在用完之后,记得自动关闭它</p>
<p><strong>(3)void Dispose()方法:</strong>开释所有该TextReader所只有的所有资源(注:参加TextReader中持有Stream或其他对象,当TextReader实行了Dispose方法时,Stream对象也被开释了)</p>
<p><strong>(4)int Peek()方法:</strong>这个方法重要是探求当前char的下一个char,当返回值是-1时,表现下个char已经时最后一个位置的char了。</p>
<p><strong>(5)int Read()方法:</strong>同样,Read方法是读取下一个char,但是和Peek方法不同,Read方法使指针只想下个字符,但是Peek方法照旧指向原来的那个字符</p>
<p><strong>(6)int Read(char[] buffer,int index,int count)方法:</strong>这个重载Read方法和上一篇文章中Stream的Read方法有点神似,区别就是一个参数是byte数组,而这个是char数组,(注:是通过Reader将数据读入buffer数组),index从哪个位置开始,count读取char数目。</p>
<p><strong>(7)int ReadBlock(char[] buffer,int index,int count)方法:</strong>和Read方法根本一致,区别是从服从上来说ReadBlock更高点,而且ReadBlock并非属于线程安全,使用时要留意。</p>
<p><strong>(8)virtual string ReadLine()方法:</strong>顾名思义,这个方法将读取每一行数据并返回当前行的字符的字符串。</p>
<p><strong>(9)virtual string ReadToEnd()方法:</strong>包罗从当前位置到TextReader的接微的所有字符的字符串</p>
<p>下面,我们就写几个简单的示例来演示一下上面的几个属性和方法。</p>

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;
17               int data = reader.ReadBlock(charBuffer, 0, 3);
18               for (int i = 0; i < charBuffer.Length; i++)
19               {
20                     Console.WriteLine("通过readBlock读出的数据:{0}", charBuffer);
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             }
31
32             using (TextReader reader = new StringReader(text))
33             {
34               string allData = reader.ReadToEnd();
35               Console.WriteLine("全部的数据为:{0}", allData);
36               reader.Close();
37             }
38
39             Console.ReadLine();

<p><strong> 输出效果:</strong></p>
<p><div align="center"></div></p>
<p><strong> 二、StreamReader</strong></p>
<p>在说明StreamReader之前,还有一件事要提起,那就是多态,多态到底是什么概念呢?聪明的你肯定会想到多态不就是子类的多种表现形式嘛。不错,但这照旧不完全的,不但云云,现实天下中,父亲帮儿子买房子,但是他没有在房产证上写儿子的名字,所以,这个房子儿子和父亲能共同使用,儿子能根据自己的爱好装修房子,父亲也能在儿子装修睦的房子内,也就是说父类能够机动使用子类的功能,更科学的一点就是子类的指针答应(赋值给)父类指针,上述雷子中,TextReader reader=new StringReader(text) 这个就是个多态的经典例子,大家不妨深刻明白下这个更重要的概念。</p>
<p><strong>1、Encoding编码</strong></p>
<p>为什么要简单介绍Encoding编码呢?由于Encoding编码在Stream和相干类中起的非常重要的作用,由于Encoding类会在后续的博文中具体解释,现在我就先介绍下Encoding类的一些重要的编码。</p>
<p><div align="center"></div></p>
<p> 以上边是Encoding类中一些特定的编码,大家先了解即可,但使用Default时有点必须留意,如果你用的不一样编码的机器的时间,留意服务器或其他操作体系的编码规则,举个例子,如果你在一个中文操作体系中进行编码,但是发布到了一个其他语言的操作体系上,那就会出现标题,这时间,你必须选择一个通用的编码。</p>
<p><strong>2、StreamReader类的定义和作用</strong></p>
<p>StreamReader的定义:实现一个TextReader,使其以以重特定的编码从字节省中读取字节。在对于流的操作中,StreamReader对于流的读取方面非常重要,为什么这么说呢?我们常用的文件的复制、移动、上传、下载、压缩、生存、远程FTP文件的读取、乃至于HttpResponse等等只要是于流相干的任何派生类StreamReader都能够轻松处理,当然,大家乃至可以自定义相干的派生类去实现复杂的序列化。在现实项目中,我们可能碰到过许多上述的环境,偶然乱码标题会让我们发狂,但是只要深刻去明白计出的话,我信任大家都能找到得当自己的办理方法。</p>
<p><strong>3、StreamReader类的常用属性和方法</strong></p>
<p>其实StreamReader的一些方法已经在父类TextReader中说的很细致了,但是个人以为构造函数和属性高才是重点。</p>
<p>构造函数:</p>
<p><strong>(1)StreamReader(Stream stream):</strong>将Stream作为一个参数放入StreamReader,如许的话,StreamReader可以对该Stream进行读取操作,Stream对象可以非常广泛,包括所有Stream的派生类对象。</p>
<p><strong>(2)StreamReader(string string,Encoding encoding):</strong>这里的string对象不是简单的字符串,而是文件的地址,然后根据用户选择的编码去读取流中的数据。</p>
<p><strong>(3)StreamReader(string string,bool detectEncodingFromByteOrderMarks):</strong>偶然间我们盼望步调自动判断用何种编码去读取,这时间detectEncodingFromByteOrderMarks这个参数就能起这个作用了,当设置为true的时间,通过检察流的前三个字节来检测编码。如果文件以得当的字节次序标记开头,该参数自动辨认UTF-8、Little-Endian Unicode和Big-Endian Unicode文本,当为false时,方法会去使用用户提供的编码。</p>
<p><strong>(4)StreamReader(string string,Encoding encoding,detectEncodingFromByteOrderMarks,int bufferSize):</strong>这个方法提供了4个参数的重载,前3个我们都已经了解,最后一个时缓冲区巨细的设置。</p>
<p>StreamReader还有其他的一些构造函数,都是上述4个的扩充,大家可以自己看一下。</p>
<p><strong>4、属性:</strong></p>
<p><strong>(1)BaseStream:</strong>大家对于前前一章流的操作应该没什么标题,我就直接企切主题,最简单的明白就是将上述构造函数的流对象在重新取出来进行一系列的操作。</p>
<p>但是如果构造函数中是路径怎么办?一样,构造函数能够将路径文件转化成流对象</p>

1 FileStream fs = new FileStream ( "D:\\TextReader.txt", FileMode.Open , FileAccess.Read ) ;
2 StreamReader sr= new StreamReader ( fs ) ;
3 //本例中的BaseStream就是FileStream
4 sr.BaseStream.Seek (0 , SeekOrigin.Begin ) ;

<p> </p>
<p><strong>(2)CurrentEncoding:</strong>获取当前StreamReader的Encoding</p>
<p><strong>(3)EndOfStream:</strong>判断StreamReader是否已经处于当前流的末了</p>
<p>好了,下面我们就几个示例来演示一下上述的方法和属性:</p>

1 static void Main(string[] args)
2         {
3            
4             //文件地址
5             string txtFilePath="D:\\TextReader.txt";
6             //定义char数组
7             char[] charBuffer2 = new char;
8
9             //使用FileStream类将文件文本数据变成流然后放入StreamReader构造函数中
10             using(FileStream stream = File.OpenRead(txtFilePath))
11             {
12               using (StreamReader reader = new StreamReader(stream))
13               {
14                     //StreamReader.Read()方法
15                     DisplayResultStringByUsingRead(reader);
16               }
17             }
18
19             using (FileStream stream = File.OpenRead(txtFilePath))
20             {
21               //使用Encoding.ASCII来实行下
22               using (StreamReader reader = new StreamReader(stream,Encoding.ASCII,false))
23               {
24                     //StreamReader.ReadBlock()方法
25                     DisplayResultStringByUsingReadBlock(reader);
26               }
27             }
28
29             //实行用文件定位直接得到StreamReader,顺便使用 Encoding.Default
30             using(StreamReader reader = new StreamReader(txtFilePath, Encoding.Default,false,123))
31             {
32                //StreamReader.ReadLine()方法
33               DisplayResultStringByUsingReadLine(reader);
34             }
35
36             //也可以通过File.OpenText方法直接获取到StreamReader对象
37             using (StreamReader reader = File.OpenText(txtFilePath))
38             {
39               //StreamReader.ReadLine()方法
40               DisplayResultStringByUsingReadLine(reader);
41             }
42
43             Console.ReadLine();
44         }
45
46         /// <summary>
47         /// 使用StreamReader.Read()方法
48         /// </summary>
49         /// <param name="reader"></param>
50         public staticvoid DisplayResultStringByUsingRead(StreamReader reader)
51         {
52             int readChar = 0;
53             string result = string.Empty;
54             while ((readChar=reader.Read()) != -1)
55             {
56               result += (char)readChar;
57             }
58             Console.WriteLine("使用StreamReader.Read()方法得到Text文件中的数据为 : {0}", result);
59         }
60
61         /// <summary>
62         /// 使用StreamReader.ReadBlock()方法
63         /// </summary>
64         /// <param name="reader"></param>
65         public static void DisplayResultStringByUsingReadBlock(StreamReader reader)
66         {
67             char[] charBuffer = new char;
68             string result = string.Empty;
69             reader.ReadBlock(charBuffer,0,10);
70             for (int i = 0; i < charBuffer.Length; i++)
71             {
72               result += charBuffer;
73             }
74             Console.WriteLine("使用StreamReader.ReadBlock()方法得到Text文件中前10个数据为 : {0}", result);
75         }
76
77
78         /// <summary>
79         /// 使用StreamReader.ReadLine()方法
80         /// </summary>
81         /// <param name="reader"></param>
82         public static void DisplayResultStringByUsingReadLine(StreamReader reader)
83         {
84             int i=1;
85             string resultString = string.Empty;
86             while ((resultString=reader.ReadLine() )!= null)
87             {
88               Console.WriteLine("使用StreamReader.Read()方法得到Text文件中第{1}行的数据为 : {0}", resultString, i);
89               i++;
90             }
91            
92         }

<p><strong> 输出效果:</strong></p>
<p><div align="center"></div></p>
<p> </p>
<p> 好了,StreamReader的相干知识我们就分享到这里,盼望对大家有所资助。<strong>非常感谢 逆时针の风 的博客对我的资助</strong>。</p><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/xiaomowang/p/11719335.html" target="_blank">https://www.cnblogs.com/xiaomowang/p/11719335.html</a>
页: [1]
查看完整版本: 关于StreamReader的知识分享