1. 스트림(Stream)

박은서's avatar
Feb 09, 2026
1. 스트림(Stream)

1. 스트림(Stream)

1️⃣ 스트림이란?

데이터를 하나씩 흘려보내면서 처리하는 도구

2️⃣ 입출력 스트림의 종류

1) 처리 단위 기준

구분
설명
대표 클래스
바이트 스트림
1바이트 단위 처리
InputStream, OutputStream
문자 스트림
문자 단위 처리
Reader, Writer

2) 방향 기준

구분
설명
입력 스트림
읽기 (InputStream, Reader)
출력 스트림
쓰기 (OutputStream, Writer)

2. 버퍼(Buffer)

1️⃣ 버퍼란?

데이터를 바로 처리하지 않고, 잠깐 모아두는 임시 저장 공간(상자)

2️⃣ 버퍼가 필요한 이유

❌ 버퍼가 없을 때

  • 데이터가 올 때마다 바로 처리
  • 입출력(I/O) 호출이 너무 많아짐 → 느림

✅ 버퍼가 있을 때

  • 데이터를 일정량 모아서 한 번에 처리
  • I/O 횟수 감소 → 성능 향상

3️⃣ 버퍼링이란?

데이터를 바로 처리하지 않고, 버퍼에 미리 모아두었다가 한꺼번에 처리하는 과정
  • 버퍼 = 데이터를 담아두는 공간
  • 버퍼링 = 그 공간을 활용하는 동작/기법

3. 실습

1️⃣ 입력 스트림 (Input) + 버퍼

1) 실습 01

package com.mtcoding.ex01; import java.io.IOException; import java.io.InputStream; public class Buf01 { public static void main(String[] args) { // 1. 키보드와 컴퓨터가 Byte 스트림이 연결됨 InputStream in = System.in; // 2. 바이트 읽기 try { int n = in.read(); // 키보드로부터 입력 대기 상태 (\n - 엔터키) System.out.println(n); } catch (IOException e) { throw new RuntimeException(e); } } }
➡️ 실습01의 단점
  • 글자를 하나씩만 받을 수 있음
  • 숫자를 문자로 캐스팅 해주지 않음

2) 실습 02

package com.mtcoding.ex01; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class Buf02 { public static void main(String[] args) { // 1. 바이트 스트림 연결 InputStream in = System.in; // 불편한 점 : 글자 하나씩만 받을 수 있음(-> 버퍼 필요), 숫자를 문자로 캐스팅 안 해줌(-> char로 캐스팅) // 2. 배열을 가질 수 있고, 문자로 캐스팅 해줌 InputStreamReader ir = new InputStreamReader(in); char[] buf = new char[3]; // 버퍼 -> 글자를 여러 개 받을 수 있음(단점 : 크기 고정됨) try { ir.read(buf); // 키보드 입력 대기 (\n 까지) for (char c : buf) { System.out.print(c + ", "); } } catch (IOException e) { throw new RuntimeException(e); } } }
➡️ 실습 01 단점 보완
  • 버퍼(배열)로 여러 문자 받을 수 있음
  • char 문자로 받을 수 있음
➡️ 실습 02 단점
  • 버퍼(배열)의 크기가 고정되어 있음

3) 실습 03

package com.mtcoding.ex01; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class Buf03 { public static void main(String[] args) { // 기능 확장 -> 데코레이터(장식) 패턴 // 1. 바이트 스트림 연결 InputStream in = System.in; // 스트림 연결됨 // 2. 숫자를 문자로 변환해주는 것을 설정 InputStreamReader ir = new InputStreamReader(in); // 3. 직적 배열을 다는 게 아니라, 가변 배열을 달아줌 BufferedReader br = new BufferedReader(ir); // 상자를 직접 만들어 주겠다! try { String line = br.readLine(); System.out.println(line); } catch (IOException e) { throw new RuntimeException(e); } } }
➡️ 실습 02 단점 보완
  • BufferedReader로 가변하는 상자(배열)를 만들어 배열의 크기를 고정하지 않을 수 있음

2️⃣ 출력 스트림 (Output) + 버퍼

package com.mtcoding.ex01; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; public class buf04 { public static void main(String[] args) { // 1. 바이트 스트림 연결 OutputStream out = System.out; // 모니터 연결 OutputStreamWriter ow = new OutputStreamWriter(out); BufferedWriter bw = new BufferedWriter(ow); try { bw.write("ABC"); // bw.flush(); // 버퍼를 비워라! (꽉 찼을 때는 자동으로 비워짐) } catch (IOException e) { throw new RuntimeException(e); } } }

3️⃣ FileWriter

package com.mtcoding.ex02; import java.io.*; // 쓰기 public class File01 { public static void main(String[] args) { OutputStream out = new FileOutputStream("파일명"); OutputStreamWriter ow = new OutputStreamWriter(out); BufferedWriter bw = new BufferedWriter(ow); } }
package com.mtcoding.ex02; import java.io.*; // 쓰기 public class File01 { public static void main(String[] args) { try { FileWriter fw = new FileWriter("socket.txt"); BufferedWriter bw = new BufferedWriter(fw); bw.write("ABC"); bw.flush(); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image

4️⃣ FileReader

package com.mtcoding.ex02; import java.io.*; // 읽기 public class File02 { public static void main(String[] args) { try { FileReader fr = new FileReader("socket.txt"); BufferedReader br = new BufferedReader(fr); String line = br.readLine(); System.out.println(line); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image

4. 필기 정리

notion image
notion image
Share article