【小白专用】c#之FileStream对象读写大文件

提及文件流,不得不先说以下几个类
FileStream,MemoryStream,NetWorkStream,StreamReader,StreamWriter,TextReader,TextWriter
在用这些类之前,我们先来了解一下这些类的用途以及区别。

C# 中常用的文件流(FileStream、StreamReader/Writer、MemoryStream)_c# filestream和streamwriter-CSDN博客

读取数据:

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);             //将字节数组转换为字符串
Console.WriteLine(str);

写入数据

FileStream fs = new FileStream(path,FileMode.Append);  //初始化文件流
byte[] arr = Encoding.UTF8.GetBytes("程序人生道可道");   //将字符串转换为字节数组
fs.Write(arr,0,arr.Length);                            //将字节数组写入文件流
fs.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();                                          //关闭流
Console.WriteLine(line);

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

写入数据:

FileStream fs = new FileStream(path,FileMode.Append); //初始化文件流
StreamWriter sw = new StreamWriter(fs);               //初始化StreamWriter
sw.WriteLine("程序人生道可道");                         //写入一行数据
sw.Close();                                           //关闭流
fs.Close();                                           //关闭流

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

“` 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Reflection; 
using System.Text;

namespace IO目录管理 
{ 
class Program 
{ 
private string _StrSourcePath = @”E:\TestDir\Test\1.txt”; //源文件目录 
private string _StrTagrgetPath = @”F:\TestDir\Test\1.txt”; //目标文件目录

 public void Test()
  {
    //路径合法性判断
    if(File.Exists(_StrSourcePath))
    {
      //构造读取文件流对象
      using (FileStream fsRead = new FileStream(_StrSourcePath, FileMode.Open)) //打开文件,不能创建新的
      {
        //构建写文件流对象
        using (FileStream fsWrite = new FileStream(_StrTagrgetPath,FileMode.Create)) //没有找到就创建
        {
          //开辟临时缓存内存
          byte[] byteArrayRead = new byte[1024 * 1024]; // 1字节*1024 = 1k 1k*1024 = 1M内存

          //通过死缓存去读文本中的内容
          while(true)
          {
            //readCount 这个是保存真正读取到的字节数
            int readCount = fsRead.Read(byteArrayRead, 0, byteArrayRead.Length);

            //开始写入读取到缓存内存中的数据到目标文本文件中
            fsWrite.Write(byteArrayRead, 0, readCount);


            //既然是死循环 那么什么时候我们停止读取文本内容 我们知道文本最后一行的大小肯定是小于缓存内存大小的
            if(readCount < byteArrayRead.Length)
            {
              break; //结束循环
            }
          }
        }
      }
    }
    else
    {
      Console.WriteLine("源路径或者目标路径不存在。");
    }
  }


  static void Main(string[] args)
  {
    Program p = new Program();
    p.Test();

  }
}

}