NET 中system.IO(Stream) 的学习笔记二

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);
                }
            }
        }

 

posted @ 2015-12-30 14:37  咕-咚  阅读(428)  评论(0编辑  收藏  举报