Keep on going never give up.

Let's Go

C# 学习笔记(37)使用FileStream(文件流)来读写文件

C#Lonely2019-05-14 22:22:2234次0条

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();

运行结果:

png

总结:大文件使用FileStream,小文件则看是否为文本文件,若是非文本文件则用File类的 ReadAllBytes、WriteAllBytes,若是文本文件则看是否单行读写,若是单行读写则用StreamReader类、StreamWriter 类,若不是单行读写则用File类的ReadAllText、WriteAllText。

注:任意类型的文件都可以用FileStream来读写。



暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!