zoukankan      html  css  js  c++  java
  • 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类似,再次不多做介绍。

  • 相关阅读:
    linux删除/var/log/下面所有日志 如何重新记录日志
    DIV里的内容自动换行
    it冲突:commit your changes or stash them before you can merge. 解决办法
    git切换到远程分支
    【异常】warning: refname 'feature1.3.0' is ambiguous.导致git merge失败
    在此篇文章中,我们将用 15 分钟对 PHP v7.x 版本更改进行简要回顾
    input元素所有type类型及相关作用
    微信自动关闭内置浏览器页面,返回公众号窗口 WeixinJSBridge.call('closeWindow')
    css背景渐变色
    数组的forEach和map和for方法的区别
  • 原文地址:https://www.cnblogs.com/lsy1991/p/8032173.html
Copyright © 2011-2022 走看看