TextReader的常用属性和方法:
我们闭上眼可以想象一下 Text这个词的范围,它囊括了许多的文件类型,我们可以在记事本上
使用任何语言(英语,中文,c# ,天书,javascript,jquery,xml,xaml,sql,c++……),如此多
的语言文本归根结底还是通过一个个char组成的,所以微软构造出了TextReader这个抽象类对于
读取text的一系列操作,同样对于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:从哪个位置开始(从哪个位置开始装,是buffer中的位置,不是流中的位置,注意区分,index 和offset 连个参数的区别滴呀), count:读取char数量
*7: int ReadBlock(Char[] buffer,int index,int count)方法:
和Read方法基本一致,区别是从效率上来说ReadBlock更高点,而且ReadBlock并非属于线程安全,使用时要注意
*8:virtual string ReadLine() 方法:
顾名思义,这个方法将读取每一行的数据并返回当前行的字符的字符串
*9:virtual string ReadToEnd()方法:
包含从当前位置到 TextReader 的结尾的所有字符的字符串
实际测试
Read()和Peek()测试使用
string vals="fuck"; using (TextReader reader = new StringReader(vals)) { //测试一 read Console.WriteLine("reader={0}", (char)reader.Read());//f Console.WriteLine("reader={0}", (char)reader.Read());//u Console.WriteLine("reader={0}", (char)reader.Read());//c Console.WriteLine("reader={0}", (char)reader.Read());//k //测试二 peek //read 是一个char 一个char的读取 Console.WriteLine("peek={0}", (char)reader.Peek()); //f Console.WriteLine("peek={0}", (char)reader.Peek()); //f Console.WriteLine("peek={0}", (char)reader.Peek()); //f Console.WriteLine("peek={0}", (char)reader.Peek()); //f //总结read()方法使指针指向下个字符,但是peek还是指向原来那个字符 //测试三 read and peek 混合 Console.WriteLine("reader={0}", (char)reader.Read());//f Console.WriteLine("reader={0}", (char)reader.Read());//u Console.WriteLine("reader={0}", (char)reader.Read());//c Console.WriteLine("peek={0}", reader.Peek()); //107 Console.WriteLine("reader={0}", (char)reader.Read());//k Console.WriteLine("peek={0}", reader.Peek()); //当读取完之后 值为-1 ////测试五: Console.WriteLine("values={0}", reader.Read());//f read()读完之后,指针指向下一个u Console.WriteLine("values={0}", reader.Peek());//u //测试六,完整读取数据; while (reader.Peek() > -1 || reader.Peek() != -1) { Console.WriteLine("values={0}",(char) reader.Read()); } } Console.ReadLine();
ReadLine()使用
//一行一行的读取数据; string vals = "fuck\nyou"; using (TextReader reader = new StringReader(vals)) { Console.WriteLine(reader.ReadLine());//fuck Console.WriteLine(reader.ReadLine());//you 一行的一行的读取 } //错误,死循环 string vals1 = "fuck\n you"; using (TextReader reader = new StringReader(vals1)) { while (reader.ReadLine() != "")//fuck { Console.WriteLine(reader.ReadLine()); //这样只能读取到you, } } //正确 string vals2 = "fuck\nyou\ncome on"; using (TextReader reader = new StringReader(vals2)) { while (reader.Peek() > -1) { Console.WriteLine(reader.ReadLine()); } } ////方法三 string vals3 = "fuck\nyou"; using (TextReader reader = new StringReader(vals3)) { string s = ""; while ((s = reader.ReadLine()) != null) //没有值,返回的是null 而不是 string.Empty 或者"" { Console.WriteLine(s); } }
正确理解Read(Char[] buffer,int index,int count)(注意:是通过reader 将数据数据读入buffer数组),index:从哪个位置开始(从哪个位置开始装,是buffer中的位置,不是流中的位置),count:读取char数量,返回的是读取到的数据量;
StreamReader 类的定义和作用
StreamReader 的定义:实现一个TextReader,使其以一种特定的编码从字节流中读取字符;对于流的操作,streamReader对流的读取是十分重要滴呀;
我们常用的文件的复制,移动,上传,下载,压缩,保存,远程FTP文件的读取,
甚至于HttpResponse等等只要是于流相关的任何派生类StreamReader 都能够轻松处理
首先上构造函数:
*1: StreamReader(Stream stream)
将stream作为一个参数 放入StreamReader,这样的话StreamReader可以对该stream进行读取操作,Stream对象可以非常广泛,包括所有Stream的派生类对象
*2: StreamReader(string string, Encoding encoding)
这里的string对象不是简单的字符串而是具体文件的地址,然后根据用户选择编码去读取流中的数据
*3: StreamReader(string string,bool detectEncodingFromByteOrderMarks)
有时候我们希望程序自动判断用何种编码去读取,这时候detectEncodingFromByteOrderMarks这个参数就能起作用了,当设置为true的 时候数通过查看流的前三个字节
来检测编码。如果文件以适当的字节顺序标记开头,该参数自动识别 UTF-8、Little-Endian Unicode 和 Big-Endian Unicode 文本,当为false 时,方法会去使用用户提供
的编码
*4: StreamReader(string string, Encoding encoding, bool detectEncodingFromByteOrderMarks,int bufferSize)
这个放提供了4个参数的重载,前3个我们都已经了解,最后个是缓冲区大小的设置,
*StreamReader 还有其他的一些构造函数,都是上述4个的扩充,所以本例就取上述的4个构造函数来说明
实际代码实例(常用的读写操作)
TextWrite 和TextReader 操作的是char类型的 字符组。
FileStream 类型操作的是byte 类型的数据滴呀。
static void readByChar() { string path = @"d:\test.txt"; byte[] buffer; //FileStream fs2 = File.OpenRead(""); 同样可以这样写滴呀; using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { //这个就死一个完整读取 long len = fs.Length; buffer = new byte[len]; //获取字节流的长度滴呀; fs.Read(buffer, 0, buffer.Length); //这样一步步一的转换滴呀; string text = Encoding.Default.GetString(buffer); //再转化为我们的string类型的数据 Console.WriteLine(text); //这个大概该就是我们流数据的读取的啦; //还有我们的一步读取数据呢? } } static void ReadByChar() { string path = @"d:\fuck.txt"; using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { using (TextReader reader = new StreamReader(fs,Encoding.Default)) //这是编码格式 { string val = reader.ReadToEnd(); Console.WriteLine(val); //这样我们直接就将数据读取来了滴呀; //从名字上我们就可以判断,这两个使用来读取字符类型的流; } } } static void WriteByByte() { string path = @"d:\fuck.txt"; using (FileStream fs = new FileStream(path, FileMode.Create)) { string vals = "hello world"; byte[] bt = Encoding.Default.GetBytes(vals); //要先将string 转成byte类型 fs.Write(bt, 0, bt.Length); } } static void WriteByChar() { string path = @"d:\shit.txt"; using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)) { using (TextWriter write = new StreamWriter(fs,Encoding.Default)) //要设置编码格式滴呀 { string text = "hello stream"; write.Write(text); } } }