一、FileStream

用途:主要用于对磁盘上文件的读写,常用于向磁盘存储数据或读取配置文件。
优点:该类维护内部文件指针,当处理大型文件时非常省时,因为马上可以定位到正确的位置。
缺点:该类是通过字节形式来读写数据的,需要自己处理编码转换,把字节数据转换为文本。

  • 读取文件内容
  • FileStream fileStream = File.Open(文件路径, FileMode.Open);//初始化文件流
    byte[] array = new byte[fileStream.Length];//初始化字节数组,用来暂存读取到的字节
    fileStream.Read(array, 0, array.Length);//读取流中数据,写入到字节数组中
    fileStream.Close(); //关闭流
    
  • 写入文件内容
  • FileStream fileStream = File.Open(文件路径, FileMode.Append);//初始化文件流
    byte[] array = Encoding.Default.GetBytes(写入文本);//给字节数组赋值
    fileStream.Write(array, 0, array.Length);//将字节数组写入文件流
    fileStream.Close();//关闭流
    

    二、StreamReader/StreamWriter

    用途:主要用来处理流数据,它们分别提供了高效的流读取/写入功能。
    优点:可以直接用字符串进行读写,而不用转换成字节数组。
    注意:对于文本文件的读写,通常用 StreamReader 类和 StreamWriter 类更方便,其底层是通过FileStream实现读写文本文件。

  • 读取文件内容
  • FileStream fs = new FileStream(path,FileMode.Open);  //初始化文件流
    StreamReader sr = new StreamReader(fs);              //初始化StreamReader
    string line = sr.ReadLine();                         //直接读取一行
    string line = sr.ReadToEnd()                         //读取全文
    sr.Close();                                          //关闭流
    fs.Close();                                          //关闭流
    

    读取数据时 sr 和 fs 关闭的顺序颠倒同样可以读取到数据,考虑代码规范,常规写法就行。

  • 写入文件内容
  • FileStream fs = new FileStream(path,FileMode.Append); //初始化文件流
    StreamWriter sw = new StreamWriter(fs);               //初始化StreamWriter
    sw.WriteLine("写入文本");                         //写入一行数据
    sw.Close();                                           //关闭流
    fs.Close();                                           //关闭流
    

    写入数据时 fs 一定要在 sw 后面关闭,否则会抛出异常(因为你在写入数据之前,你已经把文件流给关闭了,肯定写不进去数据了)

    三、TextReader/TextWriter

    用途:主要用来处理流数据,它们分别提供了高效的流读取/写入功能。
    TextReader,TextWriter类分别是StreamReader,StreamWriter的父类,像子类的 Read() 等方法其实都是重写了父类的方法。

  • 读取文件内容
  • TextReader tr = File.OpenText(path);   //读取路径
    string str = tr.ReadLine();            //读取一行数据
    
  • 写入文件内容
  • FileStream fs = new FileStream(path, FileMode.Append); //初始化文件流
    TextWriter sw = new StreamWriter(fs);                  //子类是父类
    sw.WriteLine("2019年3月1日17:51:09");                  //写入一行数据
    sw.Close();                                           //关闭流
    fs.Close();
    

    四、MemoryStream

    用途:内存流类,主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明 MemoryStream 类来存储并且处理它们。

    string str = "你好,客户端"; 
    byte[] arr = Encoding.UTF8.GetBytes(str);        //将字符串转换为字节数组
    MemoryStream ms=new MemoryStream(arr);           //初始化MemoryStream类
    byte[] arrNew = ms.ToArray();                    //将内存中的数据转换为字节数组
    string strNew = Encoding.UTF8.GetString(arrNew); //将字节数组转换为字符串
    

    五、NetWorkStream

    用途:网络流类,专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。

    TcpListener lis = new TcpListener(5000);             //服务器监听
    lis.Start();                                         //启动
    Socket socket = lis.AcceptSocket();                  //阻塞,直到有客户端连接
    NetworkStream netStream = new NetworkStream(socket); //得到Socket中的流
    if (netStream.DataAvailable)                         //如果客户端发送了消息
        byte[] data = new byte[1024];                    //定义一个字节数组,用来存放接收的数据
        int len = netStream.Read(data, 0, data.Length);  //从开始位置,读取到字节数组末尾
        string line = Encoding.Default.GetString(data, 0, len);  //把收到的字节转换为字符串
     netStream.Flush();                                  //刷新流中的数据
     netStream.Close();                                  //关闭流
    
    TcpClient client = new TcpClient();                  //客户端tcp对象
    client.Connect("127.0.0.1", 5000);                   //连接服务器
    NetworkStream myStream = client.GetStream();         //得到网络流
    byte[] data = Encoding.Default.GetBytes("你好");      //首先把输入的字符串消息转换为字节
    myStream.Write(data, 0, data.Length);                //向 myStream 里写入数据
    myStream.Flush();                                    //刷新流中的数据
    myStream.Close();                                    //关闭流
    

    六、IO 代码优化(using自动释放资源)

    用途:主要用来处理流数据,它们分别提供了高效的流读取/写入功能。
    TextReader,TextWriter类分别是StreamReader,StreamWriter的父类,像子类的 Read() 等方法其实都是重写了父类的方法。

    //使用using语句初始化文件流
    using (FileStream fs = new FileStream(path, FileMode.Open))
        byte[] arr = new byte[fs.Length];                      //初始化字节数组
        fs.Read(arr, 0, arr.Length);                           //从流中数据读取到字节数组中
        fs.Close();                                            //关闭流
        string str = Encoding.UTF8.GetString(arr);             //将字节数组转换为字符串
    

    在 using 语句内实例化的,会在 using 语句结束时自动 Dispose(销毁)掉,这样系统资源就会得到很好的释放。
    像文件的读写,数据库的连接这些比较占用系统资源的操作,尽量都使用 using 语句。

    分类:
    后端
    标签: