考虑下面的java代码,它打开一个文件,读取所有数据,然后尝试再读取一行。
public static void main ( String[] argv) {
FileInputStream inFile = null;
try {
inFile = new FileInputStream("DemoRead.txt");
}
catch ( FileNotFoundException ex) {
System.out.println("Could not open file "+ ex.getMessage());
System.exit(0);
}
Scanner inputStream = new Scanner( inFile);
while ( inputStream.hasNext()) {
System.out.println( inputStream.nextLine());
}
System.out.println(inputStream.nextLine());
inputStream.close();
}
我希望最后的inputStream.nextLine()会抛出异常,因为没有其他东西可读。
如果我把while循环改成:
while ( true) {
System.out.println ( inputStream.nextLine());
}
按预期抛出异常。
这对我来说没有任何意义。
hasNext()
可以在文件结束之前返回false,如果没有更多的令牌剩余。当文件末尾只剩下分隔符时,就会出现这种情况。
与hasNextLine()
比较。如果你使用nextLine()
,那么条件应该是hasNextLine()
。hasNext()
与next()
配合使用
1stly hasNext()——如果此扫描器的输入中有另一个令牌,则返回true。此方法可能会在等待输入扫描时阻塞。扫描器不会超过任何输入。但是对于while循环,我们总是得到true。
在nextLine()的情况下,第二——将此扫描器推进到当前行之后,并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置被设置为下一行的开头。由于此方法继续在输入中搜索以寻找行分隔符,因此如果没有行分隔符存在,它可能会缓冲所有搜索要跳过的行的输入。
所以,在while(true)的情况下,我们总是得到true,在某些情况下,nextLine()方法没有找到行分隔符,所以给出异常,但是在while(hasNext())方法的情况下,当文件中没有令牌时,它返回false,所以循环中断,所以没有异常。