메뉴 닫기

자바 FileReader 사용법, 텍스트 파일을 읽는 가장 기본적인 방법


자바 FileReader 사용법, 텍스트 파일을 읽는 가장 기본적인 방법

📂 문자 기반 파일 입출력의 첫걸음, FileReader 완전 정복

안녕하세요.
자바로 프로그램을 개발하다 보면 텍스트 파일을 읽어야 하는 상황이 종종 생기죠.
로그 파일을 분석하거나 설정 파일을 불러오는 등 다양한 작업에서 파일 읽기는 기본 중의 기본입니다.
이럴 때 가장 손쉽게 활용할 수 있는 클래스가 바로 FileReader입니다.
처음 자바를 배우거나, 간단한 입출력 처리를 구현하고 싶은 분들에게 꼭 필요한 내용이라 이번 글에서 쉽게 풀어드릴게요.
문자 단위로 동작하는 구조 덕분에 한글 같은 유니코드 문자도 문제없이 읽을 수 있어서 활용도도 높답니다.

이번 글에서는 자바에서 FileReader를 사용해 텍스트 파일을 읽는 다양한 방법을 예제를 통해 소개합니다.
기초적인 사용법부터 버퍼를 활용한 고속 읽기, 그리고 파일이 존재하지 않을 때의 예외 처리까지 함께 다룰 예정이에요.
코드를 그대로 복사해서 실행해볼 수 있도록 준비했으니 입문자분들도 부담 없이 따라오실 수 있을 거예요.







🔗 FileReader란?

자바에서 텍스트 파일을 읽을 때 가장 기본적으로 사용하는 클래스가 바로 FileReader입니다.
java.io 패키지에 포함되어 있으며, 문자 기반의 입력 스트림으로 설계되어 있어 텍스트 데이터를 처리하는 데 특화되어 있어요.
바이트 단위가 아닌 문자 단위로 작동하기 때문에 UTF-8, EUC-KR 등 다양한 문자 인코딩 환경에서도 안정적으로 작동하는 특징이 있습니다.

FileReader는 구조가 단순하고 사용법이 직관적이기 때문에 입문자들이 파일 입출력을 이해하는 데 매우 좋은 도구입니다.
특히 CSV, TXT, 로그 파일처럼 구조가 복잡하지 않은 텍스트 파일을 읽을 때 유용하죠.
단, 대용량 파일을 처리하거나 성능 최적화가 필요한 경우에는 BufferedReader와 같은 보조 스트림과 함께 사용하는 것이 일반적입니다.

  • 📁텍스트 기반 파일을 읽는 데 적합
  • 🔤문자 단위 처리로 유니코드 문자도 안정적 처리 가능
  • 🧰기초 입출력 학습에 가장 적합한 클래스

FileReader는 내부적으로 InputStreamReader를 상속받기 때문에 인코딩이 적용된 입력도 자연스럽게 처리할 수 있습니다.
단, 명시적으로 인코딩을 지정할 수는 없기 때문에 플랫폼 기본 인코딩이 사용된다는 점을 기억하세요.

💬 FileReader는 자바에서 가장 기본적인 파일 입력 도구입니다. 구조가 단순해 초보자에게 적합하지만, 인코딩 제어가 필요할 경우 InputStreamReader 사용을 고려해보세요.

간단한 텍스트 파일을 빠르게 읽고 싶을 때 FileReader는 아주 훌륭한 선택입니다.
다음 단계에서는 실제로 어떻게 파일을 열고 데이터를 읽는지 기본적인 예제를 함께 살펴볼게요.


🛠️ 기본 사용법과 파일 경로 설정

FileReader를 사용해 텍스트 파일을 읽는 기본적인 방식은 매우 간단합니다.
파일 경로를 문자열로 지정하거나, File 객체를 생성한 뒤 그걸 인자로 넘겨주면 돼요.
아래 예제처럼 try-catch 문으로 예외 처리를 해주는 것도 잊지 마세요.

CODE BLOCK
import java.io.FileReader;
import java.io.IOException;

public class SimpleReader {
    public static void main(String[] args) {
        try {
            FileReader reader = new FileReader("sample.txt");
            int ch;
            while ((ch = reader.read()) != -1) {
                System.out.print((char) ch);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위 코드에서는 read() 메서드를 사용해 한 글자씩 읽고 있습니다.
파일 끝에 도달하면 -1을 반환하므로 while문을 종료하게 되는 구조입니다.
파일 경로는 상대 경로로 지정하면 실행 위치에 따라 달라질 수 있으니, 절대 경로 또는 File.separator 사용을 권장합니다.

💎 핵심 포인트:
파일 경로를 잘못 지정하거나 파일이 존재하지 않으면 FileNotFoundException이 발생합니다. 반드시 예외 처리를 통해 안정성을 확보하세요.

  • 📍read()는 문자 하나씩 읽을 때 사용합니다
  • 📂파일 경로는 절대 경로로 설정하는 것이 오류 방지에 효과적입니다
  • 🛡️try-catch를 통해 예외 처리는 필수입니다

기초적인 FileReader 사용법만 잘 익혀도 다양한 텍스트 파일을 읽는 작업이 가능해집니다.
다음 섹션에서는 읽기 성능을 개선할 수 있는 BufferedReader를 함께 사용하는 방법을 소개할게요.







⚙️ BufferedReader로 효율성 높이기

FileReader는 한 글자씩 읽는 구조라서 파일 크기가 크거나 줄 단위로 데이터를 처리해야 할 때는 비효율적일 수 있어요.
이럴 때는 BufferedReader를 함께 사용하면 훨씬 더 빠르고 효율적인 파일 읽기가 가능합니다.
BufferedReader는 내부 버퍼를 사용해서 여러 문자를 한 번에 읽고, readLine() 메서드를 통해 줄 단위로 처리할 수 있는 것이 특징이에요.

CODE BLOCK
import java.io.*;

public class BufferedReadExample {
    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new FileReader("sample.txt"));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

readLine()은 개행 문자 기준으로 텍스트를 나눠서 한 줄씩 읽어오는 메서드로, 줄 단위 처리가 필요한 경우 매우 유용합니다.
또한 버퍼를 사용하기 때문에 읽기 속도가 훨씬 빠르고 시스템 자원도 효율적으로 사용할 수 있어요.

  • 📌BufferedReader는 FileReader의 성능을 보완하는 보조 스트림입니다
  • 📄readLine()을 사용하면 한 줄 단위로 데이터를 읽을 수 있습니다
  • 🚀대용량 파일 처리에 적합한 방식입니다

💬 BufferedReader는 FileReader의 기능을 확장하여 줄 단위 읽기와 버퍼 기반 입출력을 가능하게 해줍니다. 실무에서도 가장 자주 쓰이는 방식입니다.

코드가 조금 더 길어졌지만, 그만큼 기능도 확장된 형태입니다.
이제는 한 줄씩 읽어 처리할 수 있는 만큼, 로그 분석이나 구성 파일 읽기 같은 작업도 수월하게 할 수 있겠죠?
다음 단계에서는 자원을 더 안전하게 관리할 수 있는 try-with-resources 구문을 알아볼게요.


🔌 try-with-resources를 활용한 자원 관리

자바 7부터 도입된 try-with-resources 구문은 파일이나 네트워크와 같이 명시적으로 닫아야 하는 자원을 자동으로 정리해주는 기능입니다.
FileReader와 BufferedReader 모두 Closeable 인터페이스를 구현하고 있기 때문에, 이 구문을 사용할 수 있어요.

이 구문을 사용하면 finally 블록 없이도 close()가 자동으로 호출되기 때문에, 자원 누수 방지는 물론 코드 가독성도 높아집니다.
특히 예외 발생 시에도 안정적으로 리소스를 정리할 수 있어 프로덕션 코드에서도 널리 사용됩니다.

CODE BLOCK
import java.io.*;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("sample.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

💎 핵심 포인트:
try-with-resources 구문은 예외 발생 여부와 관계없이 자원을 자동으로 해제해 줍니다. close() 호출을 잊는 실수를 방지할 수 있어요.

  • try-with-resources는 자원 자동 해제를 보장합니다
  • 🧼finally + close() 코드가 필요 없습니다
  • 🔐자원 누수를 막아 안정성 높은 코드를 만들 수 있습니다

예제처럼 try 괄호 안에 선언된 BufferedReader는 블록이 끝나는 순간 자동으로 닫히게 됩니다.
이제는 close() 호출을 까먹는 일 없이 안심하고 파일 입출력을 다룰 수 있겠죠?
다음 섹션에서는 자주 발생하는 오류와 그 해결법에 대해 살펴볼게요.







💡 자주 발생하는 오류와 해결법

FileReader를 처음 사용할 때 많은 분들이 겪는 대표적인 오류들이 있습니다.
이런 문제들은 대부분 사소한 실수에서 비롯되며, 원인만 정확히 알면 쉽게 해결할 수 있어요.
이제부터 실제로 많이 발생하는 오류와 그 해결 방법을 하나씩 살펴보겠습니다.

❌ 파일 경로 오류 (FileNotFoundException)

가장 흔한 오류는 파일이 존재하지 않거나 경로가 잘못되어 발생하는 FileNotFoundException입니다.
상대 경로를 사용할 경우 현재 작업 디렉토리가 어디인지 헷갈릴 수 있어요.
이런 경우에는 절대 경로 또는 File 객체를 활용하면 문제를 줄일 수 있습니다.

🔤 인코딩 문제로 글자가 깨짐

FileReader는 시스템의 기본 인코딩을 사용하기 때문에, 파일이 다른 인코딩(EUC-KR, UTF-8-BOM 등)으로 저장돼 있다면 글자가 깨져 보일 수 있어요.
이럴 땐 InputStreamReader를 사용해 인코딩을 명시적으로 지정하는 것이 좋습니다.

CODE BLOCK
BufferedReader reader = new BufferedReader(
    new InputStreamReader(new FileInputStream("sample.txt"), "UTF-8"));

🚫 close() 누락으로 인한 자원 누수

파일을 열고 사용한 뒤 close()를 호출하지 않으면 시스템 리소스가 반환되지 않아 자원 누수가 발생할 수 있어요.
반복 실행 시 파일 핸들이 쌓여 IOException이 발생할 수 있으므로, 반드시 닫아줘야 합니다.
이를 방지하려면 try-with-resources를 사용하는 것이 가장 안전한 방법이에요.

⚠️ 주의: 파일 읽기 작업은 간단해 보여도 실수 하나로 프로그램이 멈출 수 있습니다. 항상 예외 처리와 리소스 정리를 철저히 해 주세요.

  • 📌파일 경로는 정확히 확인하고, 되도록 절대 경로를 사용하세요
  • 🌐텍스트 인코딩이 다를 경우 InputStreamReader + Charset 조합을 사용하세요
  • 🔒close()를 잊지 않도록 try-with-resources를 적극 활용하세요

이제 흔히 발생하는 오류들을 이해하고 나니 훨씬 자신감이 생기셨을 거예요.
다음 섹션에서는 FileReader와 관련해 자주 묻는 질문들을 정리해볼게요.


FileReader 관련 FAQ

FileReader는 어떤 경우에 사용하는 게 좋을까요?
구조가 단순한 텍스트 파일을 읽을 때 적합합니다. 설정 파일, 로그 파일, CSV 파일 등 문자 기반 데이터에 사용하기 좋아요.
FileReader로 한글이나 특수문자도 읽을 수 있나요?
가능하지만 시스템 기본 인코딩을 따르기 때문에 깨짐 현상이 생길 수 있어요. 이 경우 InputStreamReader를 사용해 인코딩을 명시하세요.
BufferedReader는 반드시 사용해야 하나요?
필수는 아니지만, 읽기 성능 향상을 위해 사용하는 것이 일반적입니다. 특히 대용량 파일이나 줄 단위 처리 시 매우 유용해요.
파일이 없을 경우 어떻게 처리하나요?
FileReader는 파일이 없으면 FileNotFoundException을 발생시킵니다. try-catch 문으로 예외를 처리하고 사용자에게 안내하는 것이 좋습니다.
파일을 다 읽은 후 close()는 꼭 해야 하나요?
네, 반드시 호출해야 합니다. close()를 하지 않으면 파일 핸들이 해제되지 않아 자원 누수로 이어질 수 있어요.
read()와 readLine()의 차이점은 뭔가요?
read()는 한 글자씩 읽고, readLine()은 한 줄 전체를 문자열로 반환합니다. readLine()은 BufferedReader를 사용할 때만 쓸 수 있어요.
파일 인코딩을 바꾸는 방법은 없나요?
FileReader는 인코딩을 직접 설정할 수 없습니다. InputStreamReader로 감싸고 Charset을 지정하면 인코딩 제어가 가능합니다.
파일 경로는 상대 경로와 절대 경로 중 무엇이 더 안전한가요?
절대 경로가 더 안전합니다. 상대 경로는 실행 위치에 따라 달라질 수 있어 오류 발생 가능성이 높아요.



📌 FileReader로 자바 텍스트 파일 읽기 완전 정리

지금까지 자바에서 FileReader를 사용해 텍스트 파일을 읽는 방법에 대해 알아보았습니다.
가장 기본적인 read() 방식부터 시작해, BufferedReader를 활용한 효율적인 처리, try-with-resources로 자원을 안전하게 관리하는 방법까지 단계별로 살펴봤죠.
또한 초보 개발자들이 자주 겪는 경로 오류, 인코딩 문제, 자원 누수 같은 실수도 함께 짚어드렸습니다.
FileReader는 단순하지만 실무에서 여전히 많이 활용되는 클래스입니다.
기본을 탄탄히 익혀두면 더 복잡한 파일 처리나 인코딩 작업에서도 큰 도움이 되며, 나아가 InputStreamReader나 Scanner 등 다른 입출력 도구로 확장하는 데도 기반이 됩니다.
오늘 소개한 내용을 직접 코드로 실행해 보면서 내 프로젝트에도 FileReader를 자신 있게 적용해보세요.


🏷️ 관련 태그 : 자바파일입출력, FileReader, BufferedReader, 자바텍스트파일읽기, trywithresources, 자바인코딩, 자바IO, 파일읽기예제, JavaFileReader, 자바기초문법