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

while((bytes = in.read(buf,0,buf.length))!=-1)这里有疑问

while((bytes = in.read(buf,0,buf.length))!=-1)

搞不明白,假如文件100字节,数组buf容量80字节,第一次读完的时候bytes等于80,然后执行完后边的代码,程序如何回到while循坏呢?

不是已经这样了吗 bytes=80!=-1,不应该是一个死循环吗?有些理解不了这个

而且就算我现在当做能明白这个循环为什么能进行了,可buf数组在第一次循环的时候已经被填满了呀,第二次去循环的时候,是把剩下的20字节覆盖进去吗?而且in.read(buf,0,buf.length))这里第二个参数是“0”,也没有看出来任何地方对这个参数有修改,程序怎么知道应该是从81位开始读呢?


正在回答

3 回答


    • 读入缓冲区的总字节数,如果没有更多的数据,因为文件的结尾已经到达, -1 。 

刚查了下API文档,一楼的回复太给力了,让我也懂了

0 回复 有任何疑惑可以回复我~
/**
 * Reads a byte of data from this input stream. This method blocks
 * if no input is yet available.
 *
 * @return     the next byte of data, or <code>-1</code> if the end of the
 *             file is reached.
 * @exception  IOException  if an I/O error occurs.
 */
public int read() throws IOException {
    return read0();
}

read()方法返回的是下一个字节

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

in.read(buf,0,buf.length),这个方法返回的是它读取到的字节个数!

正如你假设的,文件100字节,buf容量80字节:

第一次读取的时候是返回80;

第二次进入while的时候,文件读取的字节是从第81个字节开始(读取的时候文件有个指针一边读一边移动的,前面老师讲过),就是说文件还剩下20个字节可读,所以这时候返回的字节是20;

第三次进入while的时候,文件已经没有内容可读了,所以返回的是-1;

这时候就跳出了while!

纯手打!望采纳!

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

zxj2333

问一下,在第二次的时候,文件只剩下20个字节可以读,但是当read()方法读到第20个字节时,检查到这是流的结尾时,不是返回-1吗?为什么是20
2018-10-19 回复 有任何疑惑可以回复我~
#2

慕容6072474 回复 zxj2333

你那个应该是只符合单字节的规则
2018-12-01 回复 有任何疑惑可以回复我~
#3

我爱孙佳怡

牛逼,瞬间懂了
2019-05-20 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

while((bytes = in.read(buf,0,buf.length))!=-1)这里有疑问

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