파일의 내용을 읽는 도중 파일의 끝(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하여 파일의 끝에 도달했음을 확인한 후 정상적으로 루프를 종료하는 것입니다. 상황에 맞는 방법을 선택하면 프로그램이 비정상 종료되는 것을 방지할 수 있습니다.