流读写时的偏移量参数有什么用?

格拉 2014-07-01 10:16:52

int read =ms.Read(bufferbody, 0, bufferbody.Length);
ms.Write(bufferbody,0, bufferbody.Length);

也就是第二个参数。我把它都设置为0,循环读写都没有问题,要是按它的说明,记录下来当前位置,从当前位置开始读写就报错,麻烦大神给讲讲。
...全文
337 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
格拉 2014-07-01
  • 打赏
  • 举报
回复
引用 8 楼 sunny906 的回复:
写了个例子给你,你看看

            FileStream fs = new FileStream("源文件路径", FileMode.Open, FileAccess.Read);
            byte[] bufferbody = new byte[fs.Length];
            FileStream fs2 = new FileStream("目标文件路径",FileMode.Create,FileAccess.Write);
            int offset = 0;
            int count = 1024;
            int read = fs.Read(bufferbody, offset, count);
            do
            {
                fs2.Write(bufferbody, offset, read);
                offset += read; //偏移量后移
                if (bufferbody.Length - offset > count)
                {
                    read = fs.Read(bufferbody, offset, count);
                }
                else
                {
                    read = fs.Read(bufferbody, offset, bufferbody.Length - offset);
                }
            } while (read != 0);
            fs2.Close();
            fs.Close();

            Console.WriteLine("ok");
多谢,可惜已经结了
sunny906 2014-07-01
  • 打赏
  • 举报
回复
写了个例子给你,你看看

            FileStream fs = new FileStream("源文件路径", FileMode.Open, FileAccess.Read);
            byte[] bufferbody = new byte[fs.Length];
            FileStream fs2 = new FileStream("目标文件路径",FileMode.Create,FileAccess.Write);
            int offset = 0;
            int count = 1024;
            int read = fs.Read(bufferbody, offset, count);
            do
            {
                fs2.Write(bufferbody, offset, read);
                offset += read; //偏移量后移
                if (bufferbody.Length - offset > count)
                {
                    read = fs.Read(bufferbody, offset, count);
                }
                else
                {
                    read = fs.Read(bufferbody, offset, bufferbody.Length - offset);
                }
            } while (read != 0);
            fs2.Close();
            fs.Close();

            Console.WriteLine("ok");
格拉 2014-07-01
  • 打赏
  • 举报
回复
引用 5 楼 gomoku 的回复:
那个偏移量是指‘接收缓冲区’,既你的bufferBody,的偏移量,而不是数据流的偏移量
靠谱,这个和实际的接近
於黾 2014-07-01
  • 打赏
  • 举报
回复
引用 5 楼 gomoku 的回复:
那个偏移量是指‘接收缓冲区’,既你的bufferBody,的偏移量,而不是数据流的偏移量
对的,是我记错了... 比如你定义了1028字节的数组,你先取1024个放到数组从0开始 然后再取4个放到1024开始 问题就是你数据要有1028个字节让你取,你才能先取1024,再取4 写的时候也是一样,是将数组从什么地方开始往流里写,而不是写到流的什么地方.流只能是顺序的,不能插入.
gomoku 2014-07-01
  • 打赏
  • 举报
回复
那个偏移量是指‘接收缓冲区’,既你的bufferBody,的偏移量,而不是数据流的偏移量
格拉 2014-07-01
  • 打赏
  • 举报
回复
引用 1 楼 sunny906 的回复:
偏移量的意思就是,读数据的时候从上一次读的最后位置接着往下读,比如第一次读了1024个字节,那么下一次就从1025开始读
引用 2 楼 Z65443344 的回复:
你修改了偏移位置之后,第三个参数读取长度也要改啊,否则流里哪还有那么多数据让你读? 比如流里有10个字节,你可以每次只读取1个字节,然后修改偏移位置去取下一个字节 而不是从5开始读,还读10个字节,后面就只有5个字节了.
关键现在我每次都是从0开始读取,读取出来的消息也是正常的。 如二位所说,比如有1028个字节,我之前的做法是先读1024,然后从1024读取4个长度,这样应该没错吧?可是结果是报错了,直接写成0倒是全部读取出来了,我就不明白这个参数有什么用了。
於黾 2014-07-01
  • 打赏
  • 举报
回复
比如你的数据是4个字节一组代表一个Int型 如果一次都取出来,你还要再定义一个数组去存,然后再循环数组去拼接数据 所以你可以每次只取4个放数组里,处理完了再去取另外4个,这样比较节省内存资源.
於黾 2014-07-01
  • 打赏
  • 举报
回复
你修改了偏移位置之后,第三个参数读取长度也要改啊,否则流里哪还有那么多数据让你读? 比如流里有10个字节,你可以每次只读取1个字节,然后修改偏移位置去取下一个字节 而不是从5开始读,还读10个字节,后面就只有5个字节了.
sunny906 2014-07-01
  • 打赏
  • 举报
回复
偏移量的意思就是,读数据的时候从上一次读的最后位置接着往下读,比如第一次读了1024个字节,那么下一次就从1025开始读

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧