zoukankan      html  css  js  c++  java
  • 用带缓冲区的文件流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为单位
     
  • 相关阅读:
    第一部分:开发前的准备-第二章 基础入门
    多线程笔记
    .net平台下垃圾回收机制
    xml基本操作和保存配置文件应用实例
    .net平台下C#socket通信(中)
    .net平台下C#socket通信(上)
    泛型
    面向过程和面向对象及面向对象的三大特征
    值类型和引用类型及参数传递
    js中typeof与instanceof区别
  • 原文地址:https://www.cnblogs.com/zxx193/p/3025932.html
Copyright © 2011-2022 走看看