为了账号安全,请及时绑定邮箱和手机立即绑定

bytes = in.read(buf,0,buf.length))!=-1 什么意思

while (bytes = in.read(buf,0,buf.length))!=-1) 这个是什么机制的循环 我怎么没看懂 而且bytes的数目还能等于-1 要是能等于-1的话 那第一种代码 不就是错的么 


正在回答

5 回答

我感觉楼上说的有问题,int bs = read(buf,0,buf.length)运行的时候会返回读入缓冲区的字节总数,但是(注意),如果已经到了文件末尾则返回-1,意思就是说,举个楼上一样的例子,我有个1024字节大小的字节数组,要读取一个1500字节大小的数据,首先第一次bs的值等于1024,不等于-1,进入循环打印输出,第二次bs的值等于476,不等于-1,进入循环打印输出,第三次bs的值等于-1,跳出循环,最终是可以打印输出1500数据的全部内容的,在这过程中可以发现有个类似指针的作用,read方法它会一个一个字节轮流读取数据(这是我的理解,仅供参考,如果有理解的错误的地方,也请大神们帮忙指出哈)

1 回复 有任何疑惑可以回复我~
#1

慕瓜7073846

为什么第二次bs的值会是476,第三次会是-1呢?
2018-04-11 回复 有任何疑惑可以回复我~

看了楼主的自问自答,搞懂了。

0 回复 有任何疑惑可以回复我~
#1

昵称是JaVa

搞错了,是 @charsandrew的自问自答。感谢。
2017-01-14 回复 有任何疑惑可以回复我~

还在吗?

0 回复 有任何疑惑可以回复我~

我明白了,但是是通过自己写代码试验+看read()方法的原代码,明白的。我上面说的情况确实不会发生。

如果你有兴趣,我讲给你一下。

1 回复 有任何疑惑可以回复我~

如果你的bytes是定义的数组的话,这段代码就是错误的。in.read()方法是有返回值的,返回值就是你读取了多少个字节。最多可以读取你定义的buf数组大小的字节,如果没有读完会自动再往下读取buf大小的字节。但是如果读到一半读完了,相当于你的buf数组其实是没有放满的,那你知道实际读取了多少字节吗?所有才有了返回值就是bytes这个值,如果最后这个值读出来=-1不就是读完了吗??

0 回复 有任何疑惑可以回复我~
#1

charsandrew

如果我第一次数据读入数组没读完,第二次半途读完了,那第二次读取的内容虽然写入了数组,但由于返回值是-1,那么是不满足循环条件的啊,也就是说后面老师打印输出,并没有完全将数据内容全部打印出来。是这样吗?
2016-07-19 回复 有任何疑惑可以回复我~
#2

慕粉慕名而来 回复 charsandrew

你到底有没有听老师在讲课啊,老师还给你注释的,我把注释贴上来你再看一遍,从in中批量读取字节,放入到buf这个字节数组中,从0位置开始放,最多放buf.length。返回的是读到字节的个数。而read方法是一个字节一个字节读取的
2016-07-19 回复 有任何疑惑可以回复我~
#3

charsandrew 回复 慕粉慕名而来

这个问题,我搞明白了。 我之前的疑问是:比如我要读取一个1500字节的文件,并把它输出到控制台,我定义一个1024字节数组来缓存读取,第一次读1024个字节,返回的是1024;然后将1024字节输出到控制台。然后循环读取,再读剩下的476个字节,因为读完了,返回的是-1,虽然将476个字节读进了数组,但不满足while的执行条件,所以剩下的476个字节是不会输出到控制台的。
2016-07-19 回复 有任何疑惑可以回复我~
#4

charsandrew 回复 慕粉慕名而来

然后我写代码去试验了一下,结果是全部都能输出到控制台。然后我就去看read()的源代码了,发现api中的解释有点误导人。实际上读到,在返回-1之前,是先返回476的,然后再次循环读取,返回-1。看下源代码一切都明白了,哈哈
2016-07-19 回复 有任何疑惑可以回复我~
#5

qq_析木_0 回复 charsandrew

请问是不是因为read方法是一个字节一个字节的读的,后面476个字节也依次输出了,再往后读第477个字节时,因为返回-1,所以退出循环?
2017-03-04 回复 有任何疑惑可以回复我~
#6

MartinCode

我有些不太懂, in.read(buf,0,buf.length)虽然第一次没读完返回的是字节数,第二次再读是继续往下读,但是他定义了buf,0,buf.length,应该再从第一个位置读吧???
2017-03-23 回复 有任何疑惑可以回复我~
#7

慕瓜7073846 回复 charsandrew

为什么读完了会返回-1呢
2018-04-11 回复 有任何疑惑可以回复我~
查看4条回复

举报

0/150
提交
取消

bytes = in.read(buf,0,buf.length))!=-1 什么意思

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信