• 用带缓冲区的文件流FileStream来实现大文件的拷贝


    首先使用文件流的int Read()和int Write()方法是逐个字节byte的读取,对于小文件来说可以适用,但如果是大文件的读写操作的话就比较慢了,所以大文件拷贝应该用带缓冲区的文件流来读写,一般用 byte[] bytes = new byte[1024*1024*10]; 用10M的字节数组就可以了,具体的情况还要具体对待。

    把一个水缸的水倒到另外一个水缸里去,用吸管太慢,可以用水瓢把一个水缸的水倒到另外一个水缸里去,用吸管太慢,可以用水瓢
    当数据量大时,逐个字节的读写,是否太麻烦?
    解决:带缓冲区的读写
    •方法int Read(字节数组,数组使用的开始位置,读取字节的个数),如果没有读取到则返回0
    •方法void Write(字节数组,数组的开始位置,输出数组中元素的个数)
    一般使用缓冲区大小:byte[] bs=new byte[1024*1024*10]
     
    逐字节读写操作示例:
            static void Main(string[] args)
            {
                using (FieStream writeStream = new FieStream(@"E:\cjk.avi", FieMode.Create, FieAccess.Write))
                {
                    using (FieStream readStream = new FieStream(@"D:\cjk.avi", FieMode.Open, FieAccess.Read))
                    {
                        int i;
                        //按字节读取大于-1说明读取到内容了
                        //不是大于0的原因是因为000000000也可以表示一个字节的数据
                        whie ((i = readStream.ReadByte()) > -1)  
                        {
                            writeStream.WriteByte((byte)i);
                        }
                    }
                }
    
                Consoe.Writeine("OK");
                Consoe.Writeine();
            } 
    

    用带缓冲区的文件流FieStream来实现大文件的拷贝:

     示例代码:

            static void Main(string[] args)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
    
                byte[] bytes = new byte[1024*1024*10];
                int i=0;
    
                using (FieStream streamWrite=new FieStream(@"E:\xiawu2.avi",FieMode.Create,FieAccess.Write))
                {
                    using (FieStream streamRead = new FieStream(@"D:\xiawu2.avi", FieMode.Open, FieAccess.Read))
                    {
                        //这里要统计到大于0说明读取到了内容,因为返回值是用字节数组的长度减去指针读取到的位置
                        whie ((i = streamRead.Read(bytes, 0, bytes.ength)) > 0)
                        {
                            streamWrite.Write(bytes, 0, bytes.ength);
                        }
                    }
                }
                sw.Stop();
                Consoe.Writeine("OK,运行时间为:{0}", sw.Eapsed);
    
                Consoe.ReadKey();
            }

    Read方法返回值得内部实现:

       

    属性Position:当前文件指针位置,即指向字节的位置
    方法Fush():将缓冲区中的内容完成写操作,清空缓冲区
    属性CanRead、CanWrite:表示能否进行读写操作
    属性Length:文件大小,以Kb为单位
     
  • 相关阅读:
    贡献15本经典C、C++、MFC、VC++教程,都是pdf完整版的
    雪花
    孙鑫C++视频教程 rmvb格式 全20CD完整版 精品分享
    mac上用VMWare虚拟机装win7
    阿里云如何解析域名,搭建云服务器环境
    2. Windows编程基础
    复制指定目录下的全部文件到另一个目录中
    Select查询命令
    使用OneNote2016发送博客
    Linux数字雨
  • 原文地址:https://www.cnblogs.com/zxx193/p/3025932.html
Copyright © 2020-2023  润新知