在 Java 中检测 EOF

Waleed 2022年4月26日
在 Java 中检测 EOF

在本教程中,我们将介绍如何在 Java 中使用 while 循环检测 EOF(End OF File)。我们还将讨论开发一个程序,该程序会继续读取内容直到到达文件末尾。

从编程的角度来看,EOF 是开发人员用来连续读取输入的一种特殊类型,无论是来自文件还是键盘控制台。这个过程一直持续到没有更多数据要检索。

这里值得一提的是,文件中的数据可以随时修改或更改。因此,在该文件上应用哨兵控制循环实际上是不可能的。

因此,我们强烈建议你始终使用文件结束循环来减轻上述问题的潜在威胁。

在下面的代码示例中,我们使用键盘作为输入源。

package sampleProject;
import java.util.*;
import java.util.Scanner;
public class Codesample {
   static Scanner console = new Scanner(System.in);
   public static void main(String []args) {
	 int total_ages = 0;
         int age;
         while(console.hasNext()) {
            age = console.nextInt();
            total_ages = total_ages + age;
             }

	 System.out.println("Total ages are:" + total\_ages);
      }
}

输出:

99
90
88
Ko
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at sampleProject/sampleProject.Codesample.main(Codesample.java:15)

我们首先声明和初始化扫描仪类的对象。之后,我声明了一些其他变量以在我们的代码中使用。

你可能已经注意到我们使用 console.hasNext() 作为循环迭代条件。我们已经知道控制台是我们的输入类 Scanner 的对象。

另一方面,hasNext() 是输入类 Scanner 中的预定义方法。此表达式仅在有整数输入时才返回 true。否则,它返回 false。

自行编译此代码并查看输出。从输出中可以很明显地看出,我们的程序会继续读取数据,直到我们提供了错误的输入类型。在这种情况下,该程序会引发输入不匹配异常。

文件作为输入源

在另一个示例中,我们使用文件结束控制的 while 循环来不断地从文件中读取数据。

假设我们要从文件 Students\_Result.txt 中读取所有数据。该文件包含学生姓名,后跟他们的考试成绩。

我们在这个程序中的目标是输出一个显示学生姓名、考试成绩和成绩的文件。

package sampleProject;
import java.util.*;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Codesample {
     static Scanner console = new Scanner(System.in);
     public static void main(String []args) throws FileNotFoundException {
         // declare file name as an input object
           Scanner inputFile = **new** Scanner(**new** FileReader("Students\_Result.txt"));
         // declare the output object that stores data we want to display
            PrintWriter outputFile = **new** PrintWriter("Students\_Record.txt");
         // Declare variable to store first name and last name
            String firstName, lastName;
         // declare variable to store score
            double score;
         // declare variable to store student's grad
            char grade = ' ';
         // declare and initialize counter variable
            int counter = 0;
         // continue reading data from the file until the loop reaches end of file
            while (inputFile.hasNext()) {
               // read first name from the provided file
                  firstName = inputFile.next();
               // read last name from the file
                  lastName = inputFile.next();
              // read score of the students from the filee
                 score = inputFile.nextDouble();
              // increment counter variable
                 counter++;
              // To evaluate grade of the students, we are using the switch statemet
		 switch ((int) score / 10 ) {
                   case 0:
                   case 1:
                   case 2:
                   case 3:
                   case 4:
                   case 5:
                      grade = 'F';
                      break;
                   case 6:
                       grade = 'D';
                       break;
                   case 7:
                      grade = 'C';
                      break;
                   case 8:
                      grade = 'B';
                      break;
                   case 9:
                   case 10:
                      grade = 'A';
                      break;
                      default:
  	   outputFile.println("Your score does not meet our criteria");
           
      }
     //   Display retrieved data using the outputFile object we have declared earlier
          outputFile.println(firstName + " " + lastName + " " + score + " " + grade);

           }
     // If no data is found in the output file 
        if(counter == 0) 
          outputFile.println("There is not data in your input file");
    // close output file upon reading all the data from it.
       outputFile.close();
  }

}

输出:

Waleed Ahmed 89.5 B
Bob Alice 90.0 A
Khan Arshad 100.0 A
Waqas Jameed 65.5 D
Danish Taimoor 70.5 C
Muaz Junaid 80.5 B
John Harris 88.0 B

在你的系统上编译并运行这个程序,看看会发生什么。