分块读取文件流

通用的写法就像下面这样

public void Read(Stream stream)
        {
            int buffersize = 10;  //每次读取数据流的大小
            byte[] buffer = new byte[buffersize];  
            int len = 0;
            long length = stream.Length;   //数据流的大小
            int readsize = 0;  //已经读取的数据的大小
            
            //StringBuilder sb = new StringBuilder();
            while ((len = stream.Read(buffer, 0, buffersize)) > 0)
            {
                //sb.Append(Encoding.UTF8.GetString(buffer, 0, buffersize));
                readsize += len;
                if ((length - readsize) < buffersize) //如果数据流的总长度减去已经读取的数据流的长度值小于每次读取数据流的设定的大小,那么就重新为buffer字节数组设定大小     
                {                                                            //这样可以避免最终得到的数据的结尾处多出多余的空值
                    buffersize = (int)length - readsize;
                    buffer = new byte[buffersize];
                }
                
            }            
        }


思路:首先是数据流中的Read(byte[] buffer, int offset, int count)方法。第一个参数就是存放从数据里中读取到的数据,第二个参数我经常搞混,官方给出的定义如下:buffer 中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据。我经常误以为是数据流开始读取的地方,实际上这个参数是指该从buffer的哪个地方开始存放数据,第三个参数也就是往buffer中最多可以插入数据的大小。Read()方法返回的参数是一个int类型,表示当前从数据流中读取了多少数据。比如说要读取的数据流的长度为32,我将每次读取数据流的大小设置为10,那么我总共会读取三次数据,第一次Read方法会返回10,表示第一次读了10个数据,第二次同样也会返回10,表示读了10个数据,第三次则会返回2,因为前两次总共已经读取了20个数据,只剩下2个数据没读,所以第三次Read返回的值就是2,当循环到第四次的时候,Read方法会返回0,表示当前已经没有数据可以读了。

每次循环,我都会判断一下剩余待读取的数据流的大小,如果小于每次buffer字节数组的大小,则要讲buffer字节数组的大小重新设定为剩余待读取的数据流大小,这样可以避免最终得到的数据的结尾处出现很多多余的空值




你可能感兴趣的:(NET)