分块读取文件流

本文介绍了一种从数据流中高效读取数据的方法,并详细解释了如何利用.NET中的Stream类及其Read方法来逐步读取数据,同时避免读取过程中出现冗余。

通用的写法就像下面这样

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字节数组的大小重新设定为剩余待读取的数据流大小,这样可以避免最终得到的数据的结尾处出现很多多余的空值




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值