ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【.NET流操作】TextReader、StreamReader、TextWriter、StreamWriter

2022-06-05 10:01:56  阅读:100  来源: 互联网

标签:StreamWriter TextReader string int char TextWriter reader StreamReader


TextReader

抽象类,它是StreamReader的父类,

TextReader重要成员

  • void Close()方法
    和上篇Stream一样,TextReader也有Close方法,我们必须牢记,在用完之后应该主动关闭它
  • void Dispose()方法
    释放所有该TextReader 所持有的所有资源(注意,假如TextReader中持有stream或其他对象,当TextReader执行了Dispose方法时,stream对象也被回收了)
  • int Peek()方法
    这个方法主要是寻找当前char的下个 char,当返回值是-1时,表示下个 char已经是最后一个位置的char了
  • int Read()方法
    同样,read()方法是读取下一个char, 但是和peek方法不同,read()方法使指针指向下个字符,但是peek 还是指向原来那个字符
  • int Read(Char[] buffer,int index,int count)方法
    这个重载read方法和上一章Stream的read方法有点神似,区别是一个参数是byte数组,而这个是char数组,
    (注意:是通过reader 将数据数据读入buffer数组),index:从哪个位置开始,count:读取char数量
  • int ReadBlock(Char[] buffer,int index,int count)方法:
    和Read方法基本一致,区别是从效率上来说ReadBlock更高点,而且ReadBlock并非属于线程安全,使用时要注意
  • virtual string ReadLine() 方法:
    读取每一行的数据并返回当前行的字符的字符串
  • virtual string ReadToEnd()方法:
    包含从当前位置到 TextReader 的结尾的所有字符的字符串

案例

 string text = "abc\nabc";


            using (TextReader reader = new StringReader(text))
            {
                while (reader.Peek() != -1)
                {
                    Console.WriteLine("Peek = {0}", (char)reader.Peek());
                    Console.WriteLine("Read = {0}", (char)reader.Read());
                }
                reader.Close();
            }

            using (TextReader reader = new StringReader(text))
            {
                char[] charBuffer = new char[3];
                int data = reader.ReadBlock(charBuffer, 0, 3);
                for (int i = 0; i < charBuffer.Length; i++)
                {
                    Console.WriteLine("通过readBlock读出的数据:{0}", charBuffer[i]);
                }
                reader.Close();
            }

            using (TextReader reader = new StringReader(text))
            {
                string lineData = reader.ReadLine();
                Console.WriteLine("第一行的数据为:{0}", lineData);
                reader.Close();
            }

            using (TextReader reader = new StringReader(text))
            {
                string allData = reader.ReadToEnd();
                Console.WriteLine("全部的数据为:{0}", allData);
                reader.Close();
            }

            Console.ReadLine();

输出结果:

StreamReader

StreamReader 的定义:实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。

构造函数

  • StreamReader(Stream stream)
    将stream作为一个参数 放入StreamReader,这样的话StreamReader可以对该stream进行读取操作,Stream对象可以非常广泛,包括所有Stream的派生类对象
  • StreamReader(string string, Encoding encoding)
    这里的string对象不是简单的字符串而是具体文件的地址,然后根据用户选择编码去读取流中的数据
  • StreamReader(string string,bool detectEncodingFromByteOrderMarks)
    有时候我们希望程序自动判断用何种编码去读取,这时候detectEncodingFromByteOrderMarks这个参数就能起作用了,当设置为true的 时候数通过查看流的前三个字节来检测编码。如果文件以适当的字节顺序标记开头,该参数自动识别 UTF-8、Little-Endian Unicode 和 Big-Endian Unicode 文本,当为false 时,方法会去使用用户提供的编码
  • StreamReader(string string, Encoding encoding, bool detectEncodingFromByteOrderMarks,int bufferSize)
    这个放提供了4个参数的重载,前3个我们都已经了解,最后个是缓冲区大小的设置,
  • StreamReader 还有其他的一些构造函数,都是上述4个的扩充,所以本例就取上述的4个构造函数来说明

属性

  • BaseStream
    大家对于前一章流的操作应该没什么问题,我就直切主题,最简单的理解就是将上述构造函数的流对象在重新取出来进行一系列的操作,
    可是如果构造函数中是路径怎么办,一样,构造函数能够将路径文件转化成流对象
FileStream fs = new FileStream ( "D:\\TextReader.txt", FileMode.Open , FileAccess.Read ) ; 
StreamReader sr= new StreamReader ( fs ) ; 
//本例中的BaseStream就是FileStream
sr.BaseStream.Seek (0 , SeekOrigin.Begin ) ;
  • CurrentEncoding
    获取当前StreamReader的Encoding
  • EndOfStream
    判断StreamReader是否已经处于当前流的末尾

案例

static void Main(string[] args)
        {
           
            //文件地址
            string txtFilePath="D:\\TextReader.txt";
            //定义char数组
            char[] charBuffer2 = new char[3];

            //利用FileStream类将文件文本数据变成流然后放入StreamReader构造函数中
            using(FileStream stream = File.OpenRead(txtFilePath))
            {
                using (StreamReader reader = new StreamReader(stream))
                {
                    //StreamReader.Read()方法
                    DisplayResultStringByUsingRead(reader);
                }
            }

            using (FileStream stream = File.OpenRead(txtFilePath))
            {
                //使用Encoding.ASCII来尝试下
                using (StreamReader reader = new StreamReader(stream,Encoding.ASCII,false))
                {
                    //StreamReader.ReadBlock()方法
                    DisplayResultStringByUsingReadBlock(reader);
                }
            }

            //尝试用文件定位直接得到StreamReader,顺便使用 Encoding.Default
            using(StreamReader reader = new StreamReader(txtFilePath, Encoding.Default,false,123))
            {
               //StreamReader.ReadLine()方法
              DisplayResultStringByUsingReadLine(reader);
            }

            //也可以通过File.OpenText方法直接获取到StreamReader对象
            using (StreamReader reader = File.OpenText(txtFilePath)) 
            {
                //StreamReader.ReadLine()方法
                DisplayResultStringByUsingReadLine(reader);
            }

            Console.ReadLine();
        }

        /// <summary>
        /// 使用StreamReader.Read()方法
        /// </summary>
        /// <param name="reader"></param>
        public static  void DisplayResultStringByUsingRead(StreamReader reader) 
        {
            int readChar = 0;
            string result = string.Empty;
            while ((readChar=reader.Read()) != -1) 
            {
                result += (char)readChar;
            }
            Console.WriteLine("使用StreamReader.Read()方法得到Text文件中的数据为 : {0}", result);
        }

        /// <summary>
        /// 使用StreamReader.ReadBlock()方法
        /// </summary>
        /// <param name="reader"></param>
        public static void DisplayResultStringByUsingReadBlock(StreamReader reader)
        {
            char[] charBuffer = new char[10];
            string result = string.Empty;
            reader.ReadBlock(charBuffer,0,10);
            for (int i = 0; i < charBuffer.Length; i++)
            {
                result += charBuffer[i];
            }
            Console.WriteLine("使用StreamReader.ReadBlock()方法得到Text文件中前10个数据为 : {0}", result);
        }


        /// <summary>
        /// 使用StreamReader.ReadLine()方法
        /// </summary>
        /// <param name="reader"></param>
        public static void DisplayResultStringByUsingReadLine(StreamReader reader)
        {
            int i=1;
            string resultString = string.Empty;
            while ((resultString=reader.ReadLine() )!= null)
            {
                Console.WriteLine("使用StreamReader.Read()方法得到Text文件中第{1}行的数据为 : {0}", resultString, i);
                i++;
            }
            
        }

TextWriter

StreamWriter

标签:StreamWriter,TextReader,string,int,char,TextWriter,reader,StreamReader
来源: https://www.cnblogs.com/fanfan-90/p/16343420.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有