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);
}
}
}
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);
}
}
}

4. 필기 정리


Share article