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类似,再次不多做介绍。

原文地址:https://www.cnblogs.com/lsy1991/p/8032173.html