FileStream类学习小结
使用FileStream能够对对系统上的文件进行读、写、打开、关闭等操作。并对其他与文件相关的操作系统提供句柄操作,如管道,标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream对输入输出进行缓冲,从而提高性能。
关于FileStream更详细的介绍可移步:http://www.cnblogs.com/kissdodog/archive/2013/01/19/2868117.html查看。本文通过一个简单的例子说明FileStream中异步读操作BeginRead。
BeginRead方法的定义如下:
public override IAsyncResult BeginRead(byte[] array, int offset, int numBytes, AsyncCallback userCallback, object stateObject);
参数信息:
array | 要读入数据的缓冲区。 |
offset | array 中的字节偏移量,指定开始读取的位置 |
numBytes | 指定最多读取的字节数 |
userCallBack | 异步读操作完成后调用的方法 |
stateObject | 一个用户提供的对象,它将该特定的异步读取请求与其他请求区别开来。 |
其中userCallBack是一个无返回值的委托,参数为IAsyncResult,AsyncCallBack定义如下:
public delegate void AsyncCallback(IAsyncResult ar);
该定义位于System命名空间下,它需要传入一个IAsyncResult的实例作为参数,无返回值,完成异步读操作完成之后要执行的操作。
stateObject参数是一个Object类型,这意味着可以传入任意类型的参数,该参数可以在回调函数中使用,即ar.AsyncState.
话不多说,先粘代码:
class Program { System.AsyncCallback callBack; static void Main(string[] args) { Program pro = new Program(); pro.FileStreamTest(); } private void FileStreamTest() { callBack += ReadFileCallBack; string filePath = AppDomain.CurrentDomain.BaseDirectory + "image.txt"; using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)) { byte[] buffer = new byte[fs.Length]; fs.Seek(0, SeekOrigin.Begin); IAsyncResult ar = fs.BeginRead(buffer, 0, (int)fs.Length, callBack, buffer); fs.EndRead(ar); } } private void ReadFileCallBack(IAsyncResult ar) { if (ar != null && ar.IsCompleted==true) { byte[] buffer = ar.AsyncState as byte[]; Console.WriteLine("文件读取完成"); } } }
方法FileStreamTest首先给委托callBack绑定回调方法ReadFileCallBack,ReadFileCallBack方法在异步执行完成后在控制台显示文件读取完成。然后初始化一个FileStream实例,通过异步读的方式将文件内容以字节数组形式读入buffer缓冲区内。这里我把buffer当作最后一个参数传入,在回调函数中可以查看其值。最后调用EndRead等待异步执行完成。
BeginWrite和BeginRead类似,再次不多做介绍。