Detectar EOF en Java

Waleed 12 octubre 2023
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.