Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 EOFException이 발생하는 원인과 처리 방법 완벽 정리

파일의 내용을 읽는 도중 파일의 끝(End Of File)에 도달하면 특정 상황에서 EOFException이 발생합니다.

특히 이 예외는 InputStream 계열의 객체를 사용해 데이터를 읽을 때 자주 발생합니다. 반면 다른 클래스에서는 파일 끝에 도달했을 때 예외 대신 특정 값을 반환하여 파일의 끝을 알려주는 방식을 사용합니다.

EOFException이 발생하는 경우

DataInputStream 클래스를 예로 들어 보겠습니다. 이 클래스는 readBoolean(), readByte(), readChar() 등 다양한 메서드를 제공하여 기본형(primitive) 데이터를 읽을 수 있습니다. 그러나 이러한 메서드로 파일에서 데이터를 읽는 도중 파일의 끝에 도달하면 EOFException이 발생합니다.

예제 코드

다음은 readChar() 메서드를 사용해 파일을 읽는 예제입니다.

import java.io.DataInputStream;
import java.io.FileInputStream;

public class EOFExample {
    public static void main(String[] args) throws Exception {
        // readChar() 메서드로 파일 읽기
        DataInputStream dis = new DataInputStream(new FileInputStream("D:\\data.txt"));
        while(true) {
            char ch;
            ch = dis.readChar();
            System.out.print(ch);
        }
    }
}

실행 결과 (런타임 예외)

Hello how are youException in thread "main" java.io.EOFException
at java.io.DataInputStream.readChar(Unknown Source)
at SEPTEMBER.remaining.EOFExample.main(EOFExample.java:11)

위 코드는 무한 루프(while(true)) 안에서 계속 문자를 읽기 때문에 파일의 끝에 도달하는 순간 프로그램이 비정상적으로 종료됩니다.

방법 1: 다른 스트림 클래스 사용하기

DataInputStream 클래스는 파일의 끝에 도달하지 않고서는 파일 전체를 읽을 수 없습니다. 만약 예외 없이 파일 끝을 감지하고 싶다면, InputStream 인터페이스의 다른 하위 클래스를 사용하는 것이 좋습니다.

예제 코드

다음 예제에서는 DataInputStream 대신 FileInputStream 클래스를 사용하여 파일을 읽도록 위 프로그램을 수정했습니다.

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

public class AIOBSample {
    public static void main(String[] args) throws Exception {
        // 데이터 준비
        byte[] buf = " Hello how are you".getBytes();
        // DataOutputStream으로 파일에 쓰기
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("D:\\data.txt"));
        for (byte b : buf) {
            dos.writeChar(b);
        }
        dos.flush();
        System.out.println("Data written successfully");
    }
}

실행 결과

Data written successfully

방법 2: try-catch 블록으로 예외 처리하기

Java에서 EOFException을 처리하는 또 다른 방법은 try-catch 블록을 사용하는 것입니다. 파일의 끝에 도달하여 EOFException이 발생하면 이를 catch하여 적절하게 처리한 후 루프를 종료하면 됩니다.

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;

public class HandlingEOF {
    public static void main(String[] args) throws Exception {
        DataInputStream dis = new DataInputStream(new FileInputStream("D:\\data.txt"));
        while(true) {
            char ch;
            try {
                ch = dis.readChar();
                System.out.print(ch);
            } catch (EOFException e) {
                System.out.println("");
                System.out.println("End of file reached");
                break;
            } catch (IOException e) {
            }
        }
    }
}

실행 결과

Hello how are you
End of file reached

정리

EOFException은 파일을 읽는 도중 파일의 끝에 도달했을 때 발생하는 예외입니다. 이를 처리하는 대표적인 방법은 두 가지입니다.

첫째, FileInputStream처럼 파일 끝에서 -1을 반환하는 다른 스트림 클래스를 사용하는 것입니다. 둘째, try-catch 블록으로 EOFException을 명시적으로 catch하여 파일의 끝에 도달했음을 확인한 후 정상적으로 루프를 종료하는 것입니다. 상황에 맞는 방법을 선택하면 프로그램이 비정상 종료되는 것을 방지할 수 있습니다.