C#文件流

来源:互联网 发布:网络吐槽类脱口秀节目 编辑:程序博客网 时间:2024/05/22 09:43

——FileStream

FileSream操作的是字节数组,所以FileStream可以用来操作任何类型的文件
使用FileStream读写数据的步骤

  1. 创建FileStream实例对象
  2. 创建字节数组来限定每次读取数据的大小
  3. 执行读取数据操作,
  4. 对字节数组进行解码/编码操作
  5. 关闭流
  6. 释放流所占用的资源
string path=@"C:\Users\SpringRain\Desktop\new.txt";FileStream stream = new FileStream(path,FileMode.OpenOrCreate, FileAccess.Read);byte[] Buffer = new byte[1024 * 1024 * 5];int R = stream.Read(Buffer, 0, Buffer.Length);string str = Encoding.UTF8.GetString(buffer,0, r);stream.Close();stream.Dispose();

注意

  • FileStream构造函数常用的三个参数
    • 参数1——路径
    • 参数2——枚举类型FileMode指定系统打开文件的方式(常用Append,OpenOrCreate)
    • 参数3——枚举类型FileAccess,指明对文件中的数据操作(write,read)
  • 创建的字节数组的作用
    • 这个字节数组是用于储存读取出来的数据的,我们提前定义了数值大小,则数组中只能存那么多值这样就起到了限定的作用
  • 在执行读取操作,往字节数组中填写数据的时候
    • 如果读取出来的数据大小不够填充字节数组的大小,系统会用空格填充,但是可以在解码的时候可以指定截取字节数组中多少数据,用该步骤的返回值确定,该步骤返回一个int类型的值,表示读取到的实际字节的长度
    • 参数1——用于存数据的字节数组
    • 参数2——重读取文件的哪里开始读取
    • 参数3——在文件中读取数据到哪个位置
  • 对字节数组进行解码操作
    • 参数1——解码的字节数组
    • 参数2——开始解码位置
    • 参数3——结束解码位置,其余的扔掉

上面的过程需要我手动的释放资源,微软也考虑到了这一点比较麻烦,所以提供了一种写法帮助我们自动释放资源,上面的过程就可以写成下面这样子

string path=@"C:\Users\SpringRain\Desktop\new.txt";using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read)) {byte[] Buffer = new byte[1024 * 1024 * 5];int R=stream.Read(Buffer,0,Buffer.Length);string str=System.Text.Encoding.UTF8.GetString(Buffer,0,R);            }//Using会帮助我们自动释放资源

当然往一个文件中写入数据也是这样的,只需要改一点点参数就好了

string path=@"C:\Users\SpringRain\Desktop\new.txt";using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)){string str = "Hello world";byte[] buffer = Encoding.UTF8.GetBytes(str);fsWrite.Write(buffer, 0, buffer.Length);}//这样王文件中写入数据的话会覆盖原有的数据,如果想往原来的文件中添加数据,就把FileMode.OpenOrCreate改为FileMode.Append

下面一个例子用读取和写入来实现多媒体文件的复制

using (FileStream fRead = new FileStream(soucre, FileMode.Open, FileAccess.Read)) {                using (FileStream fWrite = new FileStream(target, FileMode.Create, FileAccess.Write)) {                    byte[] buffer = new byte[1024 * 1024 * 5];                    while (true) {                        int r = fRead.Read(buffer, 0, buffer.Length);                        if (r == 0) break;                        fWrite.Write(buffer, 0, r);                    }                }            }//我们创建一个负责读取的流//创建一个负责写入的流//因为文件可能会比较大,所以我们在读取的时候 应该通过一个循环去读取//返回本次读取实际读取到的字节数//如果返回一个0,也就意味什么都没有读取到,读取完了

——StreamReader

有时候我们只需要以流的方式读取文本数据,那么除了使用FileStream之外,还有一个更简单的方式——StramReader

string path = @"C:\Users\Blue\Desktop\项目站点.txt";            using (StreamReader sr = new StreamReader(path,Encoding.Default)) {                while (!sr.EndOfStream) {                    Console.WriteLine(sr.ReadLine());                }            }//StreamReader对象的EndOfStream属性是用来判断是否读取完了指定的文件

——StraemWriter

以流的方式写入文本数据

using (StreamWriter sw=new StreamWriter(path,true)){                sw.Write("I am Appended");            };//如果省掉第二个bool参数,则会覆盖原文内容,第二参数表示是否为append
1 0