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()
を使用していることに気付いたかもしれません。コンソールが入力クラススキャナーのオブジェクトであることはすでにわかっています。
一方、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
このプログラムをコンパイルしてシステムで実行し、何が起こるかを確認します。