FileStream类不是静态类,使用时需要创建对象,FileStream类既可以对文本文件进行读也可以对多媒体文件进行写,以字节数组的形式进行读和写,多用于对大文件进行读写,区别于File类的是它对文件可进行分步读写,减小内存压力,缺点是我们需要手动的关闭和释放资源,
1、FileStream的常用方法
FileStream类的构造函数;
public FileStream(string path, FileMode mode, FileAccess access);
path:
当前 FileStream 对象将封装的文件的相对路径或绝对路径。
mode:
一个常数,用于确定如何打开或创建文件。
access:
一个常数,用于确定 FileStream 对象访问文件的方式。
public override int Read(byte[] array, int offset, int count);
public override void Write(byte[] array, int offset, int count);FileStream的读操作
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FileStream的常用方法 { class Program { static void Main(string[] args) { string path =@"C:\Users\fighting man\Desktop\FileStream的使用\vs快捷键.txt" ; FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read); //三个参数(参数1读取文件的路径,参数2对文件的做什么样的操作,参数3对文件中的数据做什么样的操作) //FileStream 用来操作字节(不是一次性读取对内存压力小适合读大文件) try { //创建FileStream类的对象(路径,对文件的操作,对文本文件数据的操作) byte[] buffer = new byte[1024 * 1024 * 1]; int r = fsRead.Read(buffer, 0, buffer.Length);//把数据读到字节数组中,返回实际读到的有效字节数 string str = Encoding.Default.GetString(buffer, 0, r);//解码到实际读到的字节数 Console.WriteLine(str); } finally { fsRead.Close();//关闭流 fsRead.Dispose();//释放流 } Console.ReadKey(); } } }
FileStream的写操作并不完全覆盖原来的文件,而是用多少字节覆盖原来的文件多少内容,而File类中的写入是完全覆盖原来的文件
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FileStream写数据 { class Program { static void Main(string[] args) { string path = @"C:\Users\fighting man\Desktop\FileStream的使用\vs快捷键.txt"; //将创建文件流对象的过程写在using当中,系统会自动的帮助我们是放资源 using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) { string str = "我好像不能全部覆盖源文件中的数据"; byte[] buffer = Encoding.Default.GetBytes(str); fsWrite.Write(buffer,0,buffer.Length);//无返回值,以字节数组的形式写入数据 } Console.WriteLine("写入ok"); Console.ReadKey(); } } }
FileStream分步读写大文件
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FilestreamMultiMediaCope { class Program { static void Main(string[] args) { //先读取要复制的多媒体文件 string source = @"C:\Users\fighting man\Desktop\FileStream的使用\高数视频.flv"; string target = @"C:\Users\fighting man\Desktop\FileStream的使用\new.flv"; CopeFile(source,target); Console.WriteLine("完成"); Console.ReadKey(); } public static void CopeFile(string str,string str1) { //首先创建一个读取流的对象 using(FileStream fsRead = new FileStream(str,FileMode.OpenOrCreate,FileAccess.Read)) { //然后创建一个写入流的对象 using(FileStream fsWrite = new FileStream(str1,FileMode.OpenOrCreate,FileAccess.Write)) { byte[] buffer = new byte[1024 * 1024 * 5];//创建一个5M的字符数组用于存放读到的数据 //数据比较大我们应该用循环来读 while (true) { int r = fsRead.Read(buffer, 0, buffer.Length);//把数据读到字节数组中,返回实际读到的字节数 //如果返回0什么也没读取到,读取完了 if (r == 0) { break; } fsWrite.Write(buffer,0,r); } } } } } }