✅ 1. 스트림(Stream)이란?
- 데이터가 한쪽에서 다른 쪽으로 연속적으로 흐르는 통로를 의미한며, 데이터의 흐름을 추상화한 객체가 Stream임.
- 쉽게말해, Stream은 수도관 데이터는 그 안에서 흐르는 물과 같은 느낌이고, 개발자가 수도꼭지를 틀거나 잠그는 역할임.
- 데이터를 바이트 단위로 입출력하기 위한 통로라고 생각하면 된다.
- 자바에서 모든 IO 기반 통신은 스트림 기반으로 만들어져 있음. ( 네트워크, HTTP, 파일, 콘솔 등 )
✅ 2. 스트림(Stream) 종류

- 크게 기본 입력 스트림, 출력 스트림이 있으며 각각 기본 스트림과 보조 스트림을 제공해준다.
- 기본, 보조 스트림 내부에서는 바이트 스트림, 문자 스트림으로 또 나누어지게 된다.
(1) 기본 스트림
- Java I/O에서 입출력을 처리하는 가장 기본적은 스트림 클래스를 의미한다.
- 즉, 입출력 처리를 위한 기능을 모두 가지고 있다고 보면됨.
[1] 바이트 스트림
- 기반 클래스: InputStream(입력), OutputStream(출력)을 구현한 클래스를 의미함.
- 처리 단위: 1바이트(8비트) 단위로 처리가 됨.
- 텍스트가 아닌 이미지, 오디오, 비디오, PDF, 이진 파일 등을 처리할 때 사용을 하는 스트림임
[2] 문자 스트림
- 기반 클래스: Reader, Writer -> 구현한 FileReader, FileWriter 등이있음.
- 처리 단위: 2바이트(16비트, UTF-16 기반)
- 사용 예시: 텍스트 파일, 문서 등 문자 기반 데이터 처리
(2) 보조 스트림
- 자체적으로 입출력 기능을 수행할 수 없지만, 기본 스트림과 함께 사용되는 보조 기능을 제공한다.
- 쉽게말해, 기본 스트림을 감싸서 기능을 확장하는 스트림을 의미함.

- 보조 스트림은 내부에 버퍼를 사용해서 여러 데이터를 한 번에 처리해 기본 스트림의 성능을 올려줄 수 있음.
- 보조 스트림은 readLine(), writeInt() 등 고급 기능을 제공을 해줌.
✅ 3. InputStream 클래스 ( 바이트 스트림 )
- 바이트 단위 입력 스트림 클래스 중 최상위 추상 클래스이다.
- 이것의 하위 클래스는 xxxInputStream 임.
- 쉽게말해, 파일을 읽어들이는 역할이라고 보면 됨. 입력
(1) abstract int read()
- 입력 스트림으로부터 1바이트를 읽어 정수로 리턴을 하는 추상 메서드이다.
- InputStream 클래스 내부의 추상 메서드로 되어있으며, 구현체들은 해당 read() 메서드를 구현하고 있음.
(2) int read(byte[] b)
- 한 바이트가 아닌, 여러 바이트를 읽을 수 있는 메서드이다.
- 입력 스트림으로부터 읽어서 byte 배열에 저장하고, 읽어 들인 바이트 개수를 리턴함.
(2) int read(byte[] b, int off, int len)
- len 바이트를 읽어서 바이트 배열의 off 위치부터 저장함.
✅ 4. OutputStream 클래스 ( 바이트 스트림 )
- 바이트 단위 출력 스트림 클래스 중 최상위 추상 클래스이다.
- 이것의 하위 클래스는 xxxOutputStream
- 출력 스트림으로부터 1바이트를 읽어 정수로 리턴을 하는 추상 메서드이다.
- 바이트 기반 출력 스트림의 최상위 추상 클래스임.
- 파일, 네트워크, 메모리 등 외부로 출력할 때 사용하는 기본 클래스임.
- 쉽게말해, 텍스트 파일에 접근해서 텍스트를 넣기 위한 클래스임.
(1) abstract void write(int b)
- 출력 스트림으로부터 1바이트를 읽어 정수로 리턴을 하는 추상 메서드이다.
(2) void write(byte[] b)
- byte형 배열 b의 모든 바이트를 출력 스트림에 씀
(3) void write(byte[] b, int off, int len)
- byte형 배열 b의 off 위치부터 len 바이트를 출력 스트림에 씀
(4) void close()
- 출력 스트림을 닫고 자원을 돌려줌
(5) void flush()
- 출력 스트림에 남아 있는 모든 데이터를 최종 목적지로 보냄
- 보통은 출력을 할 때 메모리의 버퍼에 저장을 하는데 거기 내부의 남아 있는 내용을 보내줌.
✅ 5. Reader 클래스
- 입력용 캐릭터 단위 스트림 클래스 중 최상위 추상 클래스
- 이것의 하위 클래스는 xxxReader
- FileReader: 문자 단위로 처리를 해주며, 한글도 잘 나옴 ( 2바이트 문자 단위로 읽음)
- 반면, FileInputStream은 1바이트(0~255) 단위로 읽음.
- 텍스트를 다룰 땐 FileReader가 적합함.
(1) int read()
- 입력 스트림에서 1개 문자(2바이트)를 읽어 리턴함
(2) int read(char[] cbuf)
- 입력 스트림에서 문자들을 읽어 char 형 배열 cbuf에 저장하고, 읽어 들인 문자의 개수를 리턴함
(3) boolean ready()
- 입력 스트림에 입력 데이터가 준비되었으면 true를 리턴함
(4) abstract void close()
- 입력 스트림을 닫고 자원을 반환함.
✅ 6. Writer 클래스
- 출력용 캐릭터 단위 스트림 클래스 중 최상위 추상 클래스
- 이것의 하위 클래스는 xxxWriter
- FileWriter: 문자 단위로 처리를 해주며, 한글도 잘 나옴 ( 2바이트 문자 단위로 출력 )
- 반면, FileOutputStream은 1바이트(0~255) 단위로 출력함. ( 즉, 쓰기 작업을 함 )
- 텍스트를 다룰 땐 FileWriter가 적합함.
✅ 7. 파일 입출력
(1) File 클래스
File file1 = new File("C:/example/test.txt");
File file2 = new File("C:/example", "test.txt");
File file3 = new File(new File("C:/example"), "test.txt");
- 파일이나 디렉터리를 표현하는 클래스로, 상대 또는 절대 경로(path)를 가짐
- java.io 패키지에 속하며, 파일과 디렉토리를 추상화해서 다룰 수 있도록 해주는 클래스이다.
- 실제로 파일의 내용을 읽거나 쓰는 기능은 없음. 즉, 입출력 메소드는 제공되지 않음.
- 파일이나 디렉토리의 경로, 이름, 속성, 존재 여부 등을 확인하거나 조작하는 데 사용이 됨.
- 운영체제의 파일 정보를 가지고 와서 읽는 것이라 별도의 스트림을 필요하지 않음.
- 해당 파일 클래스는 파일 메타데이터를 운영체제로 부터 받아와서 제공을 해주는 것임.
- 파일 메타데이터는 운영체제(OS)의 파일 시스템이 따로 관리하므로,
→ Java의 File 클래스만으로도 접근 가능 - 파일 데이터는 하드디스크/SSD에 실제로 저장되어 있으므로,
→ 이걸 읽거나 쓰기 위해선 운영체제의 저수준 I/O 기능을 이용하는 스트림이 필요

✅ 8. RandomAccessFile 클래스
- RandomAccessFile은 파일의 어느 위치에서든 읽고 쓸 수 있는 입출력 클래스임.
- 일반적인 FileInputStream / FileOutputStream은 순차적으로 읽고 씀
- RandomAccessFile은 **임의 위치(오프셋)**로 이동하여 파일을 조작할 수 있다는 점이 다름.
- 파일의 임의 위치에서 읽기 또는 쓰기 연산을 지원을 해줌.
- 파일을 오픈하고, 위치를 지정하고, 읽기 또는 쓰기를 함
- 읽고 쓰는 위치는 파일 포인터가 가리킴
- 파일 포인터가 가리키는 위치부터 바이트 단위로 읽거나 쓸 수 있음.
- byte 단위로 읽고 쓰며, 읽거나 쓸 때 파일 포인터가 이동됨
- 랜덤 엑세스 파일을 커다란 byte 배열로 볼 수 있음.
✅ 9. FileInputStream & FileOutputStream 클래스
- 파일로부터 데이터를 읽기/쓰기 위한 입출력용 기본 스트림이다.
- 바이트 단위의 입출력을 처리하므로 이미지나 오디오 파일과 같은 이진 파일을 다룰 때 유용함.
- 즉, txt 처럼 텍스트 파일을 처리하기에는 부족함이 많음. ( 한글이 안된다던가 그런거 )
✅ 10. FileReader & FileWriter 클래스
- 텍스트 파일을 읽거나 쓰는데 사용되는 기본 스트림이며, 문자 데이터를 입출력 할 때 사용이 됨.
- 문자 단위로 처리를 해주며, 한글도 잘 나옴 ( 2바이트 문자 단위로 읽음)
✅ 11. 콘솔 입출력과 보조 스트림
(1) Console 클래스
- 콘솔 입출력을 제공하는 클래스이다.
- 키보드 입력과 화면 출력을 편리하게 지원을 함.
- 명령 프롬프트 창과 같은 콜솔 환경에서 사용자와의 상호작용을 지원함. ( 즉, IDE에서는 지원을 안하는 듯 )
- System.console()을 사용하여 콘솔 객체를 생성함.
(2) 보조 스트림
FileInputStream fis = new FileInputStream("text.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
- 기본 스트림의 성능이나 편의성을 높이는 보조 기능을 제공하는 스트림이다.
- 입출력 기능은 기본 스트림이 필수요소이고, 해당 기본 스트림을 생성하고 이후 보조 스트림을 생성하는 구조임.
- 즉, 보조 스트림을 생성자 인자로 기본 스트림을 생성해서 넣어줘야함.
(3) 보조 스트림 종류
[1] 버퍼링 기능 제공
- BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
[2] Java의 기본 자료형을 그대로 읽기/쓰기 위한 기능 제공
- DataInputStream, DataOutputStream
[3] 다양한 출력 형식의 제공
- PrintStream, PrintWriter
[4] 텍스트 파일을 라인 단위로 읽거나 라인 번호를 관리하는 메소드 제공
- LineNumberReader
- BufferedReader의 서브 클래스이다.
- 텍스트 파일을 라인 단위로 읽어 들이는 메소드를 제공한다.
[5] 바이트 스트림과 캐릭터 스트림의 호환
- InputStreamReader, OutputStreamWriter
- 바이트 단위로 읽히는 스트림을 문자 단위로 읽을 수 있게 함.
- 특정 문자인코딩을 사용하여 변환할 수 있음
- 생성자는 InputStreamReader(InputStream in, Charset cs)
- 즉, new InputStreamReader(System.in, "euc-kr"); 형식으로 만듬 String 또는 Charset 으로 넘길 수 있음.
- 이렇게하면, read() 메서드를 통해 문자를 읽을 수 있음. 즉, 1바이트로 읽고 인코딩해서 출력해주는 것임.
- 즉, 1바이트씩 읽고 → 지정한 문자 인코딩으로 해석해서 → 문자(char)로 변환해줌.
'공부 > ☕Java' 카테고리의 다른 글
| [Java] 컬렉션 프레임워크 정리: List, Set, Map 인터페이스와 대표 구현체 총정리 (0) | 2025.05.30 |
|---|---|
| [Java] java.nio 사용법 | Path, Files, FileChannel 예제 모음 (3) | 2025.05.30 |
| [Java] java.lang 패키지 정리: Object, String, Math 클래스 총정리 (0) | 2025.05.26 |
| [Java] 자바 함수형 인터페이스와 람다식(Lambda Expression) 쉽게 배우기 (1) | 2025.05.23 |
| [Java] 제네릭(Generic) 문법 정리: 클래스, 메서드, 제한까지 (0) | 2025.05.23 |