其实之前我也有类似的疑问
现在我简单描述一下,看是否能描述清楚,解决你的问题
while((num=fr.read(buf))!=-1),我们要分析里面的判断条件到底是如何执行和内部的实现方式是什么,因为乍一看,很难看得出来,我们分开按顺序依次执行并解读
循环的结束条件的内部实现机制:- char[] ch = new char[1024];
- int num = 0;
- while((num=fr.read(ch))!=-1)
- {
- System.out.print(new String(ch,0,num));
- }
复制代码我假设你要读取的文件内容有2046个字符(1024*2-2)为什么选这个数有原因,方便理解 当第一次执行while((num=fr.read(ch))!=-1)的时候,从左到右的优先级是fr.read(ch)先执行,是这一次性读取文件中1024个字符(读取数据的时候读到\r\n时还没满1024个字符会自动换行读取,直到满了1024字符),读完后返回一共读了多少个字符,即返回读取数(角标+1),此明显返回的是1024 此时把返回值赋给num,然后判断num是否等于-1,好的不等 此时执行方法体里的输出语句:System.out.print(new String(ch,0,num));输出完毕后 此时再次回到while()判断语句,然后在上次读取结束的地方,准备再次读取1024个字符,不足1024按实际字符算,还剩1022,那么第二次读就一次性读进了1022个,并且返回1022.赋给num,判断num是否等于-1,好的此时不等 接着又是输出语句:System.out.print(new String(ch,0,num));输出完毕后 那么此时文件中没有数据了,fr.read(ch)读不到任何数据,即返回-1,并且还是把-1赋给num,接着判断num是否等于-1,明显此时相等,不执行打印输出 带你走了一遍流程,希望能帮你解惑
|