在 Java 中檢測 EOF

Waleed 2023年10月12日
在 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.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.*;
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

在你的系統上編譯並執行這個程式,看看會發生什麼。