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)
- 문자 인코딩 고려 필요