Detectar EOF en Java
En este tutorial, presentaremos cómo detectar EOF (End OF File
) usando un bucle while
en Java. También discutiremos el desarrollo de un programa que continúe leyendo contenido hasta que se alcance el final del archivo.
Desde el punto de vista de la programación, el EOF es un tipo especializado que los desarrolladores usan para leer continuamente la entrada, ya sea desde el archivo o desde la consola del teclado. Este proceso continúa hasta que no hay más datos para recuperar.
Vale la pena mencionar aquí que los datos en un archivo pueden ser modificados o alterados en cualquier momento. Por lo tanto, es prácticamente imposible aplicar un bucle controlado por centinela sobre ese archivo.
Por este motivo, le recomendamos encarecidamente que siempre utilice un bucle de fin de archivo para mitigar la amenaza potencial del problema mencionado anteriormente.
Usamos el teclado como fuente de entrada en el siguiente ejemplo de código.
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);
}
}
Producción :
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)
Comenzamos declarando e inicializando el objeto de la clase de escáner that. Después de eso, he declarado algunas otras variables para usar en nuestro código.
Es posible que haya notado que usamos console.hasNext()
como la condición de iteración del bucle. Ya sabemos que la consola es el objeto de nuestro escáner de clase de entrada.
Por otro lado, hasNext()
es un método predefinido en la clase de entrada Scanner. Esta expresión solo devuelve verdadero si hay una entrada de número entero. De lo contrario, devuelve falso.
Compile este código por su cuenta y vea el resultado. Es bastante evidente a partir de la salida que nuestro programa continúa leyendo los datos hasta que proporcionamos el tipo de entrada incorrecto. En ese caso, este programa genera una excepción de discrepancia de entrada.
Archivo como fuente de entrada
En otro ejemplo, usamos un bucle while controlado al final del archivo para leer datos del archivo continuamente.
Digamos que queremos leer todos los datos del archivo Students\_Result.txt
. El archivo contiene los nombres de los estudiantes seguidos de sus puntajes en las pruebas.
Nuestro objetivo en este programa es generar un archivo que muestre los nombres de los estudiantes, los puntajes de las pruebas y las calificaciones.
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();
}
}
Producción :
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
Compile y ejecute este programa en su sistema para ver qué sucede.