C# Stream学习笔记1

Stream:提供字节序列的一般视图
字节序列:字节对象都被存储为连续的字节序列,字节按照一定的顺序进行排序组成了字节序列
Stream类是一个抽象类,无法直接使用,必须自定义流,继承并实现
    CanRead:只读属性,判断该流是否能够读取
    CanSeek:只读属性,判断该流是否支持跟踪查找
    CanWrite:只读属性,判断当前流是否可写
    void Flush():MSDN描述是:使用此方法将所有信息从基础缓冲区移动到其目标或者清除缓冲区,或者同时执行两种操作。
                根据对象的状态,可能需要修改流内的位置
                当使用StreamWriter或BinaryWriter类时,不要刷新Stream基对象,而应该使用该类的Flush或close方法,此方法
                确保先将该数据刷新至基础流,然后再将其写入文件
    Length:表示流的长度
    Position:标识流的位置,有时候Stream对象被缓存了,导致了Position属性在流中无法找到正确的位置,解决这个问题的方法
    就是每次使用流之前必须将Stream.Position设置成0就行了,但是不能从根本上解决,最好的方法就是用Using语句将流对象包裹起来,用完关闭回收即可
    abstract int Read(byte[] buffer,int offset.int count):包含了三个关键的参数,缓冲字节数组,位偏移量和读取字节个数,每读取一个字节后会返回
        一个缓冲区的总字节数,也就是总共读取的字节数
    abstract long Seek(long offset,SeekOrigin origin):重新设定流中的一个位置
        SeekOrigin枚举值
            Begin:指定流的开头
            Current:指定流的当前位置
            End:指定流的结尾
        如果offset为负,则要求新位置位于origin指定的位置之前,其间隔相差offset指定的字节数,如果offset为0,则要求新位置位于origin指定的位置处
        如果offset为正,则要求新位置位于origin指定的位置之后,其间隔相差offset指定的字节数
        Stream.Seek(-3,Origin.End):表示在流的末端往前数第三个位置
        Stream.Seek(0,Origin.Begin):表示在流的开头位置
        Stream.seek(3,Origin.Current):表示在流的当前位置往后数第三个位置
        查找之后返回一个流中的新位置
       
    abstract void Write(byte[] buffer,int offset,int count):这个方法包含了3个关键的参数:缓冲字节数组、位偏移量和读取字节个数
    virtual void Close():关闭流并释放资源
   
TextReader和StreamReader
    TextReader:Text的读取器,通过连续的字符进行读取
        抽象类,无法直接实例化,只有定义类的行为,不针对特定实现
        1、具有一个protected类型的构造函数
        2、void Close()方法:用完之后应该主动关闭它
        3、void Dispose()方法:释放所有该TextReader所持有的资源,
            (注意,假如TextReader中持有Stream或其他对象,当TextReader执行了Dispose方法时,stream对象也被回收了)
        4、int Peek()方法:寻找当前char的下一个char,当返回值是-1,表示下个char已经是最后一个位置的char了
        5、int Read()方法:读取下一个char,和peek()方法不同,read()方法使指针指向下个字符,但是peek韩式指向原来那个字符
        6、int Read(char[] buffer,int index,int count)方法:
            和Stream的Read方法相似,通过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的结尾的所有字符的字符串
       
   
    StreamReader
        联想到多态,子类的多种表现形式,也是父类能够灵活的使用子类的功能,更科学的一点就是子类的指针允许(赋值给)父类指针
       
        Encoding编码
            Default:获取系统当前的ANSI代码页的编码
            ASCII:获取ASCII(7位)字符的编码
            Unicode:获取使用Little-Endian字节顺序的UTF-16格式的编码
            UTF32:获取使用Little-Endian字节顺序的UTF-32格式的编码
            UTF7:获取UTF-7格式的编码
            UTF8:获取UTF-8格式的编码
            使用Default必须注意一点,如果你用不一样编码的及其的时候,注意服务器或者其他操作系统的编码规则,有时候可议选择一个通用编码规则
       
        StreamReader类的定义和作用
            定义:实现一个TextReader,使其以一种特定的编码从字节流中读取字符
            在对于流的操作中,StreamReader对于流的读取方面非常重要,我们常用的文件的复制、移动、下载、压缩、保存
            远程FTP文件的读取,甚至于HttpResponse等等只要是和流相关的任何派生类StreamReader都能够轻松处理,当然,大家甚至可以自定义相关的派生类去
            实现复杂的序列化
        StreamReader类的常用属性及方法
            有些方法已经在其的父类TextReader中说过了,构造函数和属性才是重点
            构造函数
                StreamReader(Stream stream)
                    将stream作为一个参数放入StreamReader,这样的话StreamReader可以对该stream进行读取操作,Stream对象可以非常广泛,包括所有Stream的派生类对象
                StreamReader(string fileName,Encoding encoding)
                    这里的fileName不是简单的字符串,而是具体的文件地址,然后根据用户选择编码去读取流中的数据
                StreamReader(string fileName,bool detectEncodingFromByteOrderMarks)
                    设置detectEncodingFromByteOrderMarks为true,通过查看流的前三个自己诶来检测编码,如果文件以适当的字节顺序标记开头,该参数自动识别UTF-8、
                    Little-Endian Unicode和Big-Endian Unicode文本,当为false的时候,方法会使用用户提供的编码
                StreamReader(string string, Encoding encoding, bool detectEncodingFromByteOrderMarks,int bufferSize)
                    最后一个参数是设置缓冲区大小
            属性
                BaseStream
                CurreEncoding:获取当前StreamReader的Encoding
                EndOfStream:判断StreamReader是否已经处于当前流的末尾
           
   
TextWriter和StreamWriter
    TextWriter
        想了解StreamWriter必须了解父类TextWriter的结构和用法
        TextWriter的构造,常用属性和方法
            和所有抽象类一样,该类不能直接实例化,它有两个构造函数
            TextWriter():初始化TextWriter类的新实例
            TextWriter(IFormatProvider):使用指定的格式提供程序初始化TextWriter类的新实例
        IFormatProvider接口的简单介绍
            格式化的提供者,string.format("{0:P}",data),这里IFormatProvider被隐式调用了
            有关数字格式化隐性使用IFomatProvider的例子
            货币:Console.WriteLine(string.format("显示货币格式{0:c3}",12))
            十进制:Console.WriteLine(string.format("显示货币十进制格式{0:d10}",12))
            科学计数法:Console.WriteLine(string.format("科学计数法{0:e5}",12))
            固定点格式:Console.WriteLine(string.format("固定点格式{0:f10}",12))
            常规格式:Console.WriteLine(string.format("常规格式{0:g10}",12))
            数字格式:Console.WriteLine(string.format("数字格式{0:n5}",12))
            百分号格式:Console.WriteLine(string.format("百分号格式(不保留小数){0:p0}",0.55))
            16进制:Console.WriteLine(string.format("十六进制{0:x0}",12))
            0定位器,此示例保留5位小数,如果小数部分小于5位,用0填充:Console.WriteLine(string.format("0定位器{0:000.00000}",1222.133))
            数字定位器:Console.WriteLine(string.format("数字定位器{0:(#).###}",0200.0233000))
            小数:Console.WriteLine(string.format("小数保留一位{0:0.0}",12.222))
            百分号的另一种写法:Console.WriteLine(string.format("百分号的另一种写法,注意小数的四舍五入{0:0%.00}",0.12345))
        显示使用  
            Console.WriteLine("显性使用IFomatProvider的例子");
            //实例化numberFomatProvider对象
            NumberFormatInfo numberFomatProvider = new NumberFormatInfo();
            //设置该provider对于货币小数的显示长度
            numberFomatProvider.CurrencyDecimalDigits = 10;
            //注意:我们可以使用C+数字形式来改变provider提供的格式
            Console.WriteLine(string.Format(numberFomatProvider, "provider设置的货币格式{0:C}", 12));
            Console.WriteLine(string.Format(numberFomatProvider, "provider设置的货币格式被更改了:{0:C2}", 12));
            Console.WriteLine(string.Format(numberFomatProvider, "默认百分号和小数形式{0:p2}", 0.12));
            //将小数 “.”换成"?"
             numberFomatProvider.PercentDecimalSeparator = "?";
             Console.WriteLine(string.Format(numberFomatProvider, "provider设置的百分号和小数形式{0:p2}", 0.12));
        重要属性
            Encoding:可以获取当前TextWriter的Encoding
            FormatProvider:可以获得当前TextWriter的IFormatProvider
            NewLine:每当调用WriteLine()方法时,行结束符都会写入到文本流中,该属性就是读取该结束符字符串
        方法
            CLose():关闭TextWriter并且释放TextWriter的资源
            Dispose():释放TextWriter所占有的所有资源(和StreamReader一样)
            Flush():和StreamReader类中一样,将缓冲区所有数据立刻写入文件(基础设备)
            Write():
            WriteLine():每次都会附加写入一个换行符
   
    StreamWriter
        TextWriter是对连续字符系列处理的编写器,而StreamWriter通过特定的编码和流的方式对数据进行处理的编写器  
        StreamWriter的构造函数
            public StreamWriter(string path):参数path表示文件所在的位置
            public StreamWriter(Stream stream,Encoding encoding):
                参数stream表示可以接受Stream的任何子类或者派生类,Encoding表示让StreamWriter在写操作时使用该encoding进行编码操作
            public StreamWriter(string path,bool append):
                第二个参数,当为true时,StreamWriter会通过path去找当前文件是否存在,如果存在则进行append或overwrite的操作,否则创建新的文件
            public StreamWriter(Stream stream,Encoding encoding,int bufferSize):
                bufferSize参数设置当前StreamWriter的缓冲区的大小
        除了TextWriter的属性外,它的独有属性
            AutoFlush:这个值指示每次使用StreamWriter.Write()方法后直接将缓冲区的数据写入文件(基础流)
            BaseStream:和StreamReader相似,可以去除当前的Stream对象加以处理
   

知识共享许可协议
《C# Stream学习笔记1》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
相邻依据:发表时间
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

0 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     175.64ms