zoukankan      html  css  js  c++  java
  • 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
    you";
                using (TextReader reader = new StringReader(vals))
                {
                    Console.WriteLine(reader.ReadLine());//fuck
                    Console.WriteLine(reader.ReadLine());//you 一行的一行的读取
    
                }
    
                //错误,死循环
                string vals1 = "fuck
     you";
                using (TextReader reader = new StringReader(vals1))
                {
                    while (reader.ReadLine() != "")//fuck
                    {
                        Console.WriteLine(reader.ReadLine());
                        //这样只能读取到you,
                    }
    
                }
                //正确
                string vals2 = "fuck
    you
    come on";
                using (TextReader reader = new StringReader(vals2))
                {
                    while (reader.Peek() > -1)
                    {
                        Console.WriteLine(reader.ReadLine());
                    }
                }
    
                ////方法三
                string vals3 = "fuck
    you";
                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:	est.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);
                    }
                }
            }
  • 相关阅读:
    js保留几位小数
    IE的卸载之路(折腾1个多月,记录下。。)
    百度map
    鼠标滑轮事件监听,兼容各类浏览器
    sql server分页存储过程
    echarts(3.0)的基本使用(标签式导入)
    datagrid加分组后的效果
    python文件操作
    python求100以内素数
    python 三元运算符
  • 原文地址:https://www.cnblogs.com/mc67/p/5088773.html
Copyright © 2011-2022 走看看