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为单位
     
  • 相关阅读:
    [ solr入门 ] 在schema.xml中加入自己的分词工具
    SQLServer2005获取大数据集时内存不足的解决办法[转]
    java位操作基本教程[转]
    log4j的最佳实践(转)
    [ lucene扩展 ] "Did you mean" feature with Apache Lucene SpellChecker
    java image filters[02]过滤器初探
    PHP serialize 和 JSON 解析与区别
    js 实现 静态缓存页面中访问动态IP下载地址
    smarty section foreach遍历多维数组
    【转】window.open 参数
  • 原文地址:https://www.cnblogs.com/zxx193/p/3025932.html
Copyright © 2011-2022 走看看