개발(React | Java)/자바 기초 | 문법

📘 Java 파일 입출력 (2) File I/O 기초 — File, FileReader, BufferedReader, FileWriter 완전 정리

dev-parrot 2025. 12. 9. 17:02

파일 읽기/쓰기는 Java 개발자가 반드시 익혀야 하는 기능입니다.
로그 저장, 설정 파일 파싱, 간단한 데이터 저장 등 다양한 곳에서 활용됩니다.

이번 글에서는 가장 많이 사용되는
File, FileReader, BufferedReader, FileWriter 중심으로
파일 입출력의 핵심 기능을 쉽고 정확하게 정리합니다.


📌 목차

  1. 파일 입출력이란?
  2. File 클래스
  3. 텍스트 파일 읽기(FileReader)
  4. BufferedReader로 효율적 읽기
  5. 텍스트 파일 쓰기(FileWriter)
  6. try-with-resources — 자동으로 닫기
  7. 파일 존재 확인/삭제
  8. 실전 예제
  9. 자주 하는 실수
  10. 대표 태그

1️⃣ 파일 입출력이란?

File I/O(Input/Output)은 파일을 읽고 쓰는 작업을 의미합니다.

기본 흐름:

  • 읽기: File → Reader → BufferedReader
  • 쓰기: File → Writer

Java는 파일 작업에 여러 클래스를 제공하지만,
텍스트 기반에서는 아래 4개가 가장 많이 사용됩니다.

✔ File
✔ FileReader
✔ BufferedReader
✔ FileWriter


2️⃣ File 클래스 — 파일 자체를 의미

파일이 실제로 있든 없든 파일의 경로를 표현하는 역할입니다.

File file = new File("test.txt");

 

파일 존재 여부 확인:

file.exists(); // true or false

 

파일 정보 출력 :

file.getName();
file.getAbsolutePath();
file.length();

 

3️⃣ 파일 읽기 — FileReader

FileReader는 문자 단위로 파일 읽기를 지원합니다.

FileReader fr = new FileReader("test.txt");

int data;
while ((data = fr.read()) != -1) {
    System.out.print((char) data);
}

fr.close();

하지만 단독으로 쓰면 비효율적이기 때문에
실무에서는 대부분 BufferedReader와 함께 사용합니다.


4️⃣ 파일 읽기 — BufferedReader (가장 많이 사용)

줄 단위로 빠르게 읽을 수 있기 때문에 가장 실용적입니다.

BufferedReader br = new BufferedReader(new FileReader("test.txt"));

String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

br.close();

 

✔ readLine()은 개행문자(\n)를 제거한 문자열 반환

-> 파일 분석에 매우 유용


5️⃣ 파일 쓰기 — FileWriter

FileWriter fw = new FileWriter("output.txt");

fw.write("Hello Java\n");
fw.write("FileWriter 예제입니다.");

fw.close();

 

✔ 기존 내용을 덮어씀

기존 내용을 유지하며 추가하고 싶다면:

FileWriter fw = new FileWriter("output.txt", true); // append mode

 

6️⃣ try-with-resources — close 자동 처리

Java 7 이후 제공되는 자동 자원 해제 구문입니다.

try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

 

➡ close()를 직접 호출할 필요 없음
➡ 예외가 발생해도 자동으로 파일 스트림이 닫힘


7️⃣ 파일 존재 여부 & 삭제하기

✔ 파일 존재 확인

File file = new File("data.txt");

if (file.exists()) {
    System.out.println("파일 존재");
}

 

✔ 삭제하기

file.delete();

 

삭제 성공 여부는 boolean으로 반환됨.


8️⃣ 실전 예제 — 로그 파일 읽고 가공하기

try (BufferedReader br = new BufferedReader(new FileReader("log.txt"))) {

    String line;
    int errorCount = 0;

    while ((line = br.readLine()) != null) {
        if (line.contains("ERROR")) {
            errorCount++;
        }
    }

    System.out.println("에러 개수: " + errorCount);

} catch (IOException e) {
    e.printStackTrace();
}

 

➡ 실무에서 정말 자주 등장하는 패턴입니다.


9️⃣ 자주 하는 실수

❌ 한글 파일을 읽는데 깨짐

→ InputStreamReader + UTF-8 필요 (다음 글에서 추가 설명 가능)

❌ close() 누락

→ 메모리 누수 발생
→ 반드시 try-with-resources 사용 추천

❌ write 후 flush 안 함

→ 실제 파일에 완전히 기록되지 않을 수 있음

FileWriter는 close 시 자동 flush되지만
BufferedWriter 사용 시 flush 필요.


🔟 마무리

이번 글에서는 Java 텍스트 파일 입출력의 핵심을 정리했습니다.

✔ File 클래스
✔ FileReader / BufferedReader
✔ FileWriter
✔ 줄 단위 읽기
✔ append 모드
✔ 파일 존재 확인/삭제
✔ try-with-resources

다음 글에서는 Java의 최신 문법 기반인
람다(Lambda) & Stream을 정리합니다.
컬렉션을 훨씬 쉽게 다루게 되고,
Spring과 실무 개발에서도 매우 중요합니다.

 

 

📘 다음 글 예고

👉 Java 람다(Lambda) & Stream 완전 이해