用带缓冲区的文件流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为单位
 
原文地址:https://www.cnblogs.com/zxx193/p/3025932.html