A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 左华清 黑马帝   /  2012-1-3 14:54  /  5897 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 左华清 于 2012-1-3 16:05 编辑

public int read(byte[] b,
                int off,
                int len)
         throws IOException将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数,还有InputStream.read(byte[] b).按文档的理解应该是有时读取不到自己想要读取的个数的字节,程序应该怎样保证读取数据的完整啊!

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 为梦而战 于 2012-1-3 16:08 编辑

l      首先 len不是我们自己想指定多少就指定多少,而是通过读取字节时计数到的数。读多少它就帮我们记多少个。所以放入数组中的字节数就是它的值。也就是实际有效值。当然如果怕数组放不下,而内存又给力的话,可以把数组定的大点!内存不给力就只有循环多跑几趟了。

    一个文件如果大于你指定的数组大小 ,那读前面的时候,len就等于数组的大小,到了最后读到的字节数小于数组大小时,那len的值就是实际读入数组的字节数。
    一个文件如果小于数组大小,那len还是记录着实际读入数组的字节数。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
这个都会定义byte[1024]数组,用来储存数组,如果小于1024,返回为-1结束读取,我想byte数组里应该是存数据加空字符吧,这样数据肯定是完整的,不过理论知识还没看视频也不是很懂,有错误请指出

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
byte [] b = new byte[1024];
int len=0;
while( (len=in.read(byte)) != -1) //每次循环最多读取到1024个字节,循环结束条件为:-1(文件末尾),这样就可以将文件中所以字节都读取出来
{
    //处理代码
   out.write(b,0,len); //注意需要使用len,因为可能到达文件末尾前,最后一次循环数据可能不足1024,实际只有len个字节。
    ......
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
嗯,谢谢各位!monghuan分析得太透彻了,while(len!=-1)会一直循环,学习了!
回复 使用道具 举报
第三位您可是把代码都写错了,我不知道理解你的问题准确不准确啊 。
当你想读取数组中的所有数据off是byte[off]的开始元素到byte[len]的元素,一般在读取文件的时候,当read到文件末尾的时候,读不到数据就会返回-1,这个末尾处的数组时半满的,就好像我们写出的时候用write(buffer, 0, len) 我们只写出此数组中byte[0] 到byte[len]的数据.假如你在读取的时候read(buffer, a,b) //a和b是你自定义在数组范围的两个数且a<b       那么读取的时候也要write(buffer,a ,b)这样才能保证数据的完整,但不把数组占完整,就形成了资源的浪费

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马