FileStream类
小的文本文件(100M以下)直接用File类的ReadAllText()和WriteAllText()方法。这两个方法内部其实就是封装了StreamReader类的ReadToEnd()和StreamWriter类的WriteToEnd(),这两个方法的返回值都是string类型,所以只能读写文本文件。
小的文本文件的单行读写用StreamReader和StreamWriter这两个类。
小的非文本文件用File类的ReadAllBytes()和WriteAllBytes()读写,并用byte[]作中转站。这两个方法内部其实就是封装了FileStream的Read()和Write()方法,这两个方法的返回值都是byte数组,所以可以读写任何文件大文件,但File读写特大文件是会出错的,因为它虽然本质上用的是FileStream来读写,但是它的byte[]大小是写死了的(就是被读写文件的大小),所以它是将文件一次性全部读取或写入,文件非常大的时候往往会造成内存溢出,所以要用数据流FileStream,因为我们可以自由定义byte[]的大小,来保证内存不会溢出。
代码示例:
using System; using System.IO; //引用命名空间 using System.Text; namespace ConsoleApp { class Program { static void Main(string[] args) { //FileStream 操作字节的,代表着可以操作任何类型的文件 //引用命名空间,创建一个FileStream对象 string path = @"C:\Users\Administrator\Desktop\Test.txt"; //使用FileStream来读取数据 FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read); byte[] arr = new byte[1024 * 1024 * 5]; //5兆字节,读取5兆 //返回本次实际读取到的有效字节数,如果字节数当前不可用,则总字节数可能小于所请求的字节数;如果已到达流结尾,则为零。 int num = fs.Read(arr, 0, arr.Length); //从流中读取字节块并将该数据写入给定缓冲区中。限制读这个数组的长度,也就是5兆 //将字节数组中每一个元素按照指定的编码格式解码成字符串 string s = Encoding.Default.GetString(arr, 0, num); //关闭流 fs.Close(); //释放流所占用的资源 fs.Dispose(); Console.WriteLine(s); Console.ReadKey(); } } }
string path = @"C:\Users\Administrator\Desktop\Test.txt"; //将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源。 //用FileStream来写入数据 using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) { string str = "文件不存在的时候会自动创建一个文件,存在的时候我这部分已经覆盖你了"; byte[] arr = Encoding.Default.GetBytes(str); fs.Write(arr, 0, arr.Length); } Console.WriteLine("写入成功"); Console.ReadKey();
运行结果:
总结:大文件使用FileStream,小文件则看是否为文本文件,若是非文本文件则用File类的 ReadAllBytes、WriteAllBytes,若是文本文件则看是否单行读写,若是单行读写则用StreamReader类、StreamWriter 类,若不是单行读写则用File类的ReadAllText、WriteAllText。
注:任意类型的文件都可以用FileStream来读写。
文章评论