首先使用文件流的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为单位