黑马程序员技术交流社区

标题: InputStream读取数据的完整性问题 [打印本页]

作者: 左华清    时间: 2012-1-3 14:54
标题: InputStream读取数据的完整性问题
本帖最后由 左华清 于 2012-1-3 16:05 编辑

public int read(byte[] b,
                int off,
                int len)
         throws IOException将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数,还有InputStream.read(byte[] b).按文档的理解应该是有时读取不到自己想要读取的个数的字节,程序应该怎样保证读取数据的完整啊!
作者: 为梦而战    时间: 2012-1-3 15:12
本帖最后由 为梦而战 于 2012-1-3 16:08 编辑

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

    一个文件如果大于你指定的数组大小 ,那读前面的时候,len就等于数组的大小,到了最后读到的字节数小于数组大小时,那len的值就是实际读入数组的字节数。
    一个文件如果小于数组大小,那len还是记录着实际读入数组的字节数。
作者: 沈样    时间: 2012-1-3 15:20
这个都会定义byte[1024]数组,用来储存数组,如果小于1024,返回为-1结束读取,我想byte数组里应该是存数据加空字符吧,这样数据肯定是完整的,不过理论知识还没看视频也不是很懂,有错误请指出
作者: 刘基军    时间: 2012-1-3 15:20
byte [] b = new byte[1024];
int len=0;
while( (len=in.read(byte)) != -1) //每次循环最多读取到1024个字节,循环结束条件为:-1(文件末尾),这样就可以将文件中所以字节都读取出来
{
    //处理代码
   out.write(b,0,len); //注意需要使用len,因为可能到达文件末尾前,最后一次循环数据可能不足1024,实际只有len个字节。
    ......
}
作者: 左华清    时间: 2012-1-3 15:57
嗯,谢谢各位!monghuan分析得太透彻了,while(len!=-1)会一直循环,学习了!
作者: 王冀0127    时间: 2012-1-3 16:31
第三位您可是把代码都写错了,我不知道理解你的问题准确不准确啊 。
当你想读取数组中的所有数据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)这样才能保证数据的完整,但不把数组占完整,就形成了资源的浪费




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2