public class testBuf {
static String path = "C:/cheaters.log";
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
int totword = 0;
while (line != null) {
String a[] = line.split(" ");
for (int i = 0; i < a.length; i++) {
if (a[i].length() > 0)
totword += 1;
}
**line = br.readLine();**
}
System.out.print("Total number of words" + totword);
br.close();
}
}
我不明白为什么我们要再写一个代码&#34; line = br.readLine&#34;在循环中?我认为没有必要,但当我尝试删除它时程序将无法运行。请向我解释一下;)
答案 0 :(得分:1)
如果要移除br.readLine()
,则while循环将是无限循环。毕竟你会一次又一次地在同一行上迭代。使用readLine()
方法,您将继续前一行,直到没有剩余的行,它返回null
答案 1 :(得分:0)
每个方法调用都会读取一个奇异的行。
第一个调用读取文件的第一行,然后在while循环之后检查该行是否为空。然后,在while循环内部,再次调用该方法,并读入文件的第二行。
然后它返回到while循环的开头并检查该行是否为null。如果它不为null,则循环再次运行,如果它为null,表示您已到达文件的末尾,则循环不会运行。
这个习惯用法的一个常见缩写是读取行并将它们以类似于以下代码的方式分配给while循环内的变量:
String line = "";
int totword = 0;
while ((line = br.readLine()) != null) {
String a[] = line.split(" ");
for (int i = 0; i < a.length; i++) {
if (a[i].length() > 0)
totword += 1;
}
}
这种读取方法解决了对readLine进行两次调用的问题,因为readLine现在在while循环的每个循环中被调用,并且如果它是null则自动被检查。
答案 2 :(得分:0)
如果第一次调用readLine()
会返回非null 值,则while()
内的条件将始终为true
。所以程序将进入无限循环。
br.readLine()
会继续阅读。因此,当读数结束时你必然会得到一个空值,因此你将摆脱循环。
答案 3 :(得分:0)
由于readLine()
会读取将在此处检查的下一行:while (line != null) {
如果到达文件末尾,readLine()
将返回null
。所以,如果你不打电话给`readline?在循环中,你将使用第一行。