Back-End/Java

14. 자바 입출력(Java I/O)

Yerin Thea Yoo 2026. 2. 12. 00:56

I/O(Input/Output)는 프로그램과 외부 세계 간의 데이터 이동을 의미한다.

  • 키보드 입력
  • 파일 읽기/쓰기
  • 네트워크 통신

Java에서는 이 모든 작업을 스트림(Stream) 기반으로 처리한다.

 

1. 스트림(Stream)이란?

스트림은 데이터가 흐르는 통로다.

Java I/O는 데이터를 한 방향으로 흐르게 처리한다.

  • 입력 스트림 → 외부 → 프로그램
  • 출력 스트림 → 프로그램 → 외부

 

2. 바이트 스트림 vs. 문자 스트림

Java I/O는 크게 두 계열로 나뉜다.

바이트 스트림 (1 byte 단위)
문자 스트림 (2 byte, 문자 단위)

 

1) 바이트 스트림

  • 모든 종류의 파일 처리 가능
  • 이미지, 동영상, 바이너리 파일 등

대표 클래스

  • InputStream
  • OutputStream
  • FileInputStream
  • FileOutputStream

예시

FileInputStream fis = new FileInputStream("a.txt");
int data = fis.read();
fis.close();

 

2) 문자 스트림

  • 텍스트 파일 처리에 적합
  • 내부적으로 문자 인코딩 처리

대표 클래스

  • Reader
  • Writer
  • FileReader
  • FileWriter

예시

FileReader fr = new FileReader("a.txt");
int ch = fr.read();
fr.close();

 

 

3. 버퍼 스트림

기본 스트림은 한 글자씩 처리하므로 비효율적이다.

버퍼를 사용하면 성능이 크게 향상된다.

 

대표 클래스

  • BufferedInputStream
  • BufferedOutputStream
  • BufferedReader
  • BufferedWriter

예시

BufferedReader br = new BufferedReader(new FileReader("a.txt"));
String line = br.readLine();
br.close();

버퍼는 내부에 메모리 공간을 두고 한 번에 묶어서 처리한다.

 

4. try-with-resources

입출력에서는 자원 해제가 중요하다.

try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) {
    String line = br.readLine();
}

자동으로 close() 호출된다.

 

5. 파일 클래스 

파일 정보 관리

File file = new File("a.txt");
file.exists();
file.length();
file.delete();

파일 생성, 삭제, 경로 확인 등에 사용된다.

 

6. 입출력 흐름 구조 정리

File → FileInputStream → BufferedInputStream

또는

File → FileReader → BufferedReader

입출력 클래스는 계층적으로 연결해서 사용한다.

이를 스트림 체인(Stream Chain)이라고 한다.

 

7. NIO(New I/O) 간단 정리

Java 1.4 이후 도입

  • Channel 기반
  • Buffer 기반
  • 비동기 처리 가능
  • 성능 향상

대표 클래스

  • Path
  • Files
  • ByteBuffer
  • FileChannel

 

8. I/O에서 중요한 개념

  • 스트림은 단방향
  • 반드시 close() 필요
  • 버퍼 사용이 성능에 중요
  • 예외 처리 필수(IOException)
  • 문자 인코딩 고려 필요